SQL Server — результаты из двух таблиц, которые существуют только в одной

#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]
)