Inner Join в SQL
Есть таблица Users с полями id, First_Name, Last_Name. И есть таблица Birthday с полями Id и Date. Надо вывести Имя и фамилию человека с заданной датой рождения. Но сделать это надо через Inner Join. Пробовал сделать вот так:
SELECT Users.First_Name, Users.Last_Name FROM Users
JOIN Birthday ON Users.Id = (SELECT Id FROM Birthday WHERE
Birthday.Date = '1994-10-12');
Получаю правильные имя и фамилию, но в количестве строк, сколько есть в Birthday. Подскажите, пожалуйста, где надо поправить, чтобы на выходе была только одна запись. Или, может, есть возможность сделать как-то без дополнительного подзапроса.
Ответы (1 шт):
ON Users.Id = (SELECT Id FROM Birthday WHERE Birthday.Date = '1994-10-12')
Так лучше не делать. Результат подзапроса скорее всего будет не одной записью. Вообще если Вам в условии Join'а нужно будет сравнивать с множеством то корректнее это будет сделать так:
ON SOME_TABLE.SOME_FIELD IN (SELECT ...)
Но это не ваш случай. Вам следует соединять по идентификаторам. Т.е. просто:
INNER JOIN Birthday ON Users.Id = Birthday.Id
Также замечу что условие объединения может быть не одно.
Вы можете указать несколько условий после ON с использованием ключевого слова AND
INNER JOIN TABLE_1 ON TABLE_1.FIELD_1 = TABLE_2.FIELD_2 AND TABLE_1.FIELD_3 = TABLE_2.FIELD_4
Или же какие-то другие условия.
Условие выбора записей же можно указать в WHERE
WHERE Birthday.Date = '1994-10-12'
В WHERE вы можете указывать как условия для таблицы Users, так и для присоединенных таблиц.
Если у Вас возник вопрос в том, есть ли разница где указывать условие: в условии ON или же в WHERE, то отвечаю - разница есть, хотя в Вашем случае она незначительная.
Результат:
SELECT
Users.First_Name,
Users.Last_Name,
Birthday.Date
FROM Users
INNER JOIN Birthday
ON Users.Id = Birthday.Id
WHERE Birthday.Date = '1994-10-12';
Замечания
- подзапрос был лишний
- добавил в выборку
Birthday.Date - в данном случае подразумевается что в таблице Birthday идентификатор равен идентификатору пользователя. В противном случае вам нужно еще полу UserId