SQL LEFT JOIN с предложением LIKE для предоставления только одной строки

#sql #ms-access

#sql #ms-access

Вопрос:

У меня есть 2 таблицы, к которым я хочу присоединиться, и я хотел бы сгенерировать такое же количество строк, что и в таблице 1.

Таблица 1

  ---------- ------------ --------- ------- 
| ENTRY_ID | ROUTE_NAME | STATION | BOUND |
 ---------- ------------ --------- ------- 
|        1 |         1A |    ABCC |     1 |
|        2 |         2C |    CBDD |     1 |
|        3 |          5 |    AAAA |     2 |
|        4 |         1A |    EEEE |     1 |
|        5 |         2B |    ASFA |     2 |
|        6 |          5 |    DSAS |     1 |
|        7 |          3 |    QWEA |     2 |
|        8 |          4 |    ASDA |     1 |
 ---------- ------------ --------- ------- 
  

Таблица 2

  ------------ ------- --------- --------------- 
| ROUTE_NAME | BOUND | STATION | STOP_SEQUENCE |
 ------------ ------- --------- --------------- 
|         1A |     1 |     AAA |             1 |  
|         1A |     1 |     ABC |             2 |
|         1A |     1 |     CDA |             3 |
|         1A |     2 |     ABC |             1 |
|         1A |     2 |     ADC |             2 |
|         1A |     2 |     ACA |             3 |
|         2C |     1 |     BBB |             1 |
|         2C |     1 |     AAA |             2 |
  

Повторяется для других значений

Код, который я использовал, является :

 SELECT t1.ENTRY_ID, t1.ROUTE_NAME, t1.STATION, t1.BOUND, MIN(t2.STOP_SEQUENCE)
FROM T1 
LEFT JOIN t2 ON 
(t1.STATION LIKE '*' amp; t2.STATION amp; '*') AND
(t1.BOUND = t2.BOUND) AND
(t1.ROUTE_NAME = t2.ROUTE_NAME)
GROUP BY t1.ENTRY_ID, t1.ROUTE_NAME, t1.STATION, t1.BOUND
  

;

Функция LIKE в этом случае обязательна. Код не возвращает то же количество строк, что в таблице 1. Вместо этого для тех строк, которые не соответствуют требованию LIKE, они недоступны в результатах запроса. Как я могу получить все строки, даже если функция LIKE ничего не возвращает? Мой ожидаемый результат

  ---------- ------------ --------- ------- --------------- 
| ENTRY_ID | ROUTE_NAME | STATION | BOUND | STOP_SEQUENCE |
 ---------- ------------ --------- ------- --------------- 
|        1 |         1A |    ABCC |     1 |             2 |
|        2 |         2C |    CBDD |     1 |          NULL |
  

Для 8 строк ENTRY_ID.

Большое спасибо!

Комментарии:

1. Пропустите LEFT JOIN и GROUP BY, попробуйте вместо этого соответствующий подзапрос.

2. Если вы хотите, чтобы в результате существовали все строки table1, почему вы фильтруете их (по LIKE )?

3. Можете ли вы попробовать добавить дополнительные круглые скобки вокруг JOIN условий, например LEFT JOIN t2 ON ( (t1.STATION LIKE '*' amp; t2.STATION amp; '*') AND (t1.BOUND = t2.BOUND) AND (t1.ROUTE_NAME = t2.ROUTE_NAME) ) ?

4. Моя идея для STOP_SEQUENCE заключается в том, что если «подобных» нет, то верните NULL, если да, то верните (минимальное) соответствующее STOP_SEQUENCE (например, ENTRY_ID 1 в результате), если нет, верните NULL. Что касается связанного подзапроса и условия соединения, я не уверен, как это выполнить.

5. Проблема в том, что у вас неправильный ключ между таблицами table1 и table2, что делает это соединение pert практически невозможным.

Ответ №1:

Попробуйте вместо этого соответствующий подзапрос:

 SELECT t1.ENTRY_ID, t1.ROUTE_NAME, t1.STATION, t1.BOUND,
       (SELECT MIN(t2.STOP_SEQUENCE) FROM t2
        WHERE (t1.STATION LIKE '*' amp; t2.STATION amp; '*')
          AND (t1.BOUND = t2.BOUND)
          AND (t1.ROUTE_NAME = t2.ROUTE_NAME)) as STOP_SEQUENCE 
FROM T1