表中的sql子查询

时间:2012-03-20 20:40:12

标签: sql tsql

我有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 个答案:

答案 0 :(得分:1)

你必须比较执行计划,看看性能如何比较,但这对我来说似乎有点清洁:

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

答案 1 :(得分:0)

您可以尝试查看EXCEPT关键字。 EXCEPT功能的简要定义是

  

EXCEPT返回左查询中没有的任何不同值   也在正确的查询中找到。

使用示例表的解决方案是,     SELECT t1.First_Name,t1.Last_Name,t1.Phone FROM Table1 t1     除了     SELECT t2.First_Name,t2.Last_Name,t2.Phone FROM Table2 t2

答案 2 :(得分:0)

您的查询正在查找Table2中与Table1中的记录不匹配且ID为@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