#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