使用IN为多个字段编写查询

时间:2015-07-08 12:14:43

标签: sql

SELECT a.First_Name,b.EMPID,c.Phn
FROM NAME a,Emp b,Phone c
WHERE b.Emptype = 'New'
AND a.First_name,b.Last_name,C.Phn = (SELECT a.First_Name,b.Last_name,c.Phn
FROM NAME a,Emp b,Phone c
WHERE b.Emptype = 'Old')

基本上,我想搜索与旧客户具有相同详细信息(名字,姓氏和电话)的新客户。旧客户可以转换为新客户,但保留其详细信息。因此,唯一改变的是空白。

EG。 (John McEnroe 47589876 Old)转换成时(John McEnroe 475898876新) [名字,姓氏,电话,的empType]

3 个答案:

答案 0 :(得分:0)

老兄,这是一个使用EXISTS的查询。 Exists和IN之间的主要区别在于,使用INDEX存在查询但是IN会像很多OR一样。

SELECT a.First_Name
    ,b.EMPID
    ,c.Phn
FROM NAME a
    ,Emp b
    ,Phone c
WHERE b.Emptype = 'New'
    AND EXISTS (Select TOP 1 1 FROM
                    NAME x
                    ,Emp y
                    ,Phone z
                WHERE
                    x.First_Name = a.First_Name
                AND y.Last_name = b.Last_name
                AND z.Phn = c.Phn
                AND y.Emptype = 'Old'
            )

现在,看看你的查询,你有3个表,没有连接到其他(名称,Emp,电话),所以你真的搞乱了作为输出的数据。将,基本上这个公式:

(第1表行数)乘以(第2表行数)乘以(第3表行数)

意味着如果每个表都有100行,那么你就会得到这个:

100 x 100 x 100 = 1000000结果中的行(可怕对吗?)

答案 1 :(得分:0)

 WITH tempTable as (
       SELECT a.First_Name,b.EMPID,c.Phn
          FROM NAME a,Emp b,Phone c
          where b.Emptype = 'Old'
      )
select a.First_Name,b.EMPID,c.Phn
          FROM NAME a,Emp b,Phone c,tempTable t
          where b.Emptype = 'Old' and a.First_Name = t.First_Name
                AND b.Last_name = t.Last_name
                AND c.Phn = t.Phn;

试试这个......或者使用子查询...

答案 2 :(得分:0)

可以使用多个列进行IN查询:

AND (a.First_name,b.Last_name,C.Phn) IN (SELECT a.First_Name,b.Last_name,c.Phn
                                         FROM ... )