У меня есть два оператора SELECT, которые получают правильные данные из двух разных таблиц.
-- 1:
SELECT employee_id FROM employees
WHERE city = 'London';
-- returns employee_id = 5, 6, 7, 9
-- 2:
SELECT category_id FROM categories
WHERE category_name ILIKE 'dairy%';
-- returns category_id = 4
У меня есть таблица employees_categories, которую я хотел бы заполнить следующим образом на основе приведенных выше критериев:
| employee_id | category_id |
| ----------- | ----------- |
| 5 | 4 |
| 6 | 4 |
| 7 | 4 |
| 9 | 4 |
я мог бы использовать
INSERT INTO employees_categories (
employee_id, category_id
) VALUES (5,4), (6,4), (7,4), (9,4);
Но я надеялся создать CTE на основе двух операторов SELECT вверху, чтобы можно было использовать его для INSERT INTO (автоматизировать весь процесс в одном запросе).
У меня возникли проблемы с выяснением того, как соединить результаты из двух SELECT, поскольку employee_id или category_id потенциально повторяются (как показано), и между двумя таблицами, из которых они выбраны, нет общей связи.
Любая помощь очень ценится!
Не могли бы вы составить временную таблицу названий городов и категорий?
Определенно думал о жестком кодировании этого результата, но он не будет масштабироваться или точно реагировать на будущие запросы. Re: Таблица Temp, я уже надеялся сделать CTE с этой информацией, а затем INSERT использовать ее... может быть, две CTE?
Как узнать, какие сотрудники и категории сочетаются друг с другом? Расширение вашего примера может помочь.
Я мог бы показать результаты более подробного запроса SELECT для контекста, но проблема позволяет получать только идентификационные номера, поэтому он будет носить исключительно описательный характер. Тем не менее, точка зрения принята, спасибо


Не существует правила, согласно которому предложение ON в JOIN должно использовать обе таблицы... но будьте осторожны, если вы этого не сделаете, иначе вы можете быть удивлены тем, что вы получите.
SELECT employee_id, category_id
FROM employees
JOIN categories ON category_name ILIKE 'dairy%'
WHERE city = 'London';
Ух ты, я так впечатлена, я не знала, что ты можешь это сделать! Мне даже не пришлось уточнять синтаксис, чтобы получить именно те результаты, которые мне были нужны — как часто это происходит? Замечательный!
Вместо этого я бы использовал CROSS JOIN и поместил условие ILIKE в предложение WHERE (поскольку это не условие соединения).
@jarlh, можешь подробнее объяснить, что ты имеешь в виду? Возможно, создать другой ответ?
@AveryFreeman, employees CROSS JOIN categories WHERE category_name ILIKE 'dairy%' AND city = 'London', результат тот же, скорее дело вкуса.
Можете ли вы быть уверены, что запрос категории вернет только одну строку? Поскольку между двумя таблицами нет связи, вы также можете сделать вставку из select и жесткого кода 4 в качестве идентификатора категории.