sql подзапрос из таблицы - PullRequest
0 голосов
/ 21 марта 2012

У меня есть 2 таблицы (я использую T-SQL)

Table1

ID  First_Name Last_Name Phone
--  ---------- --------- --------------
1   John       Smith     (643) 434-4343 
2   Dave       Miller    (543) 344-3432
3   Tiffany    Ovally    (434) 343-6598
4   Dan        Davis     (534) 342-9876
5   Mike       Kolis     (454) 345-3434


Table2

Iden   FirstN     LastN      PhoneN
----   ------     -----      ------
J-09   Tiffany    Ovally    (434) 343-6598
K-98   Dan        Davis     (534) 342-9876
W-03   Dave       Miller    (543) 344-3432
C-34   Mike       Kolis     (454) 345-3434

Мне нужно проверить, что значения ключей из таблицы1 НЕ существуют в таблице2

Я делаю следующее

    IF NOT EXISTS(SELECT * FROM Table2 t2
                  WHERE t2.FirstN = (Select First_Name from Table1 where ID = @ID)
                  AND t2.LastN  = (Select Last_Name from Table1 where ID = @ID)  
                  AND t2.PhoneN = (Select Phone from Table1 where ID = @ID)        
                  )
   BEGIN
    .... 
  END

Не уверен, что есть более эффективный способ сделать это, поскольку я делаю подзапрос для каждого поля.

Спасибо

Ответы [ 3 ]

1 голос
/ 21 марта 2012

Вы должны сравнить планы выполнения, чтобы увидеть, как сравнивается производительность, но мне это кажется немного чище:

SELECT t1.*
FROM Table1 as t1
LEFT JOIN Table2 as t2
ON t1.First_Name = t2.FirstN
   AND t1.Last_Name = t2.LastN
   AND t1.Phone = t2.PHone
WHERE t2.Iden IS NULL
0 голосов
/ 21 марта 2012

Ваш запрос ищет записи в Таблице 2, которые не соответствуют записи в Таблице 1 с идентификатором @ID. Использование INNER JOIN здесь было бы лучше, чем использование нескольких подзапросов:

IF NOT EXISTS (SELECT *
               FROM FROM Table1 t1
               INNER JOIN Table2 t2 
                  ON  t1.First_Name = t2.FirstN
                  AND t1.Last_Name = t2.LastN
                  AND t1.Phone = t2.PhoneN
              WHERE t1.ID = @ID)
BEGIN
    ....
END
0 голосов
/ 21 марта 2012

Вы можете попробовать поискать ключевое слово EXCEPT .Краткое определение функциональности EXCEPT:

EXCEPT возвращает любые отличные значения из левого запроса, которые также не найдены в правом запросе.

Решение на вашем примереТаблицы будут, ВЫБЕРИТЕ t1.First_Name, t1.Last_Name, t1.Phone FROM Table1 t1, ВЫБЕРИТЕ t2.First_Name, t2.Last_Name, t2.Phone FROM Table2 t2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...