#sql #sql-server #database
#sql #sql-сервер #База данных
Вопрос:
У меня есть два стола:
Users Messages
--------- ---------
[ FirstName ] [ FirstName ]
[ LastName ] [ LastName ]
[ SSN ] [ SSN ]
[ Message ]
У меня есть следующий запрос Microsoft SQL:
SELECT
t2.FirstName,
t2.LastName,
t2.SSN
FROM
[Messages] as t1
JOIN
[User] as t2
ON
t1.SSN = t2.SSN
То, что это дает мне, — это результат, который существует в обеих таблицах. Что мне нужно сделать, так это извлекать записи из таблицы сообщений только в том случае, если их SSN не существует в таблице пользователей. Я знаю, что есть и второй шаг, но не могу в нем разобраться.
ОБНОВЛЕНИЕ: на самом деле это все еще не работает. У меня нет абсолютно никаких нулей в базе данных. Все записи заполняются данными. Что мне нужно, так это все записи из таблицы сообщений, которые не существуют в таблице пользователей.
Пример:
Users [ 1 John Smith 111-11-1111 ]
Users [ 2 Jim Tompson 999-99-9999 ]
Messages [ 1 John Smith 111-11-1111 ]
Messages [ 2 Jim Tompson 999-99-9999 ]
Messages [ 3 Angelina Jolie 888-88-8888 ]
Результатом будет:
[ 3 Angelina Jolie 888-88-8888 ]
Комментарии:
1. Используйте левое соединение и добавьте
where t2.ssn is null
oh, и вам придется изменить выбор t2 на значение t1.2. Вместо дублирования social может быть лучше ссылаться на userId в таблице Messages, а затем присоединиться к таблице Users, если вам это нужно.
3. Чисто с точки зрения дизайна SSN. не уникален. Он повторно используется через несколько десятилетий после смерти. Не у всех людей есть SSN (это конструкция США)
4. @mkross1983 спасибо за совет, я буду иметь это в виду.
5. @xQbert Я понимаю вашу точку зрения, я знаю, что SSN используется повторно, но сейчас меня больше беспокоит запуск запроса, о проверке которого я буду беспокоиться позже. Спасибо.
Ответ №1:
SELECT *
FROM messages m
WHERE NOT EXISTS
(
SELECT NULL
FROM users u
WHERE u.ssn = m.ssn
)
Ответ №2:
- T1 вместо T2 в selects . Вам нужны записи из сообщений, а не пользователей. когда мы получим наш список, вам понадобятся данные, а не нулевые значения: D
- Соединение должно быть внешним соединением (возвращать ВСЕ записи из сообщений и только те записи в пользователях, которые совпадают, поскольку порядок таблиц — это сообщения, а затем пользователи, будет работать левое соединение.)
- Наконец, поскольку вы знаете, что T2.ssn будет равен нулю, если совпадение не найдено, выполните фильтрацию по нему. Таким образом, возвращаются только сообщения, в которых SSN не найден в пользователях.
.
SELECT
t1.FirstName,
t1.LastName,
t1.SSN
FROM
[Messages] as t1
LEFT JOIN
[User] as t2
ON
t1.SSN = t2.SSN
WHERE
T2.ssn is null
Комментарии:
1. В дополнение к OP, вы можете найти это руководство полезным, я знаю, что я сделал: blog.codinghorror.com/a-visual-explanation-of-sql-joins
2. nod это одно из моих ЛЮБИМЫХ (если не самое любимое) наглядных пособий, когда речь идет о SQL и обработке / управлении ими как наборами.
Ответ №3:
Попробуйте это:
SELECT
t2.FirstName,
t2.LastName,
t2.SSN
FROM
[Messages] t2
WHERE
t2.SSN
NOT IN
(
SELECT DISTINCT
SSN
FROM
[Users]
)