SQL:将一个表中的列链接到另一个表中的不同列,并加入

时间:2018-04-26 20:09:45

标签: sql sql-server

我有一个名为Customer的表,它有两列,CustomerID和CustomerName。如下所示

declare @customer table (CustomerID INT, CustomerName VARCHAR(10)) 
INSERT INTO @customer VALUES (1, 'Shane'), (2, 'Daniel'), (3, 'Karim'), (4, 'Eric'), (5, 'Zoe'), (6, 'Jack')

enter image description here

和另一个名为Age的表,它有两列,CustomerID和Age。

declare @age table (CustomerID INT, Age INT) 
INSERT INTO @Age VALUES (1, 20), (2, 19), (3, 12), (6, 30)

enter image description here

现在,我想在Customer表上添加一个名为HasAge的列,如果Customer表中的CustomerID也存在于Age表中,则返回1,否则返回0.

我尝试使用左连接和CTE来获得结果。所以我想知道是否有另一种方法(不使用连接)。例如。在select语句中使用子查询。实际上对我来说真实的情况更复杂。为了演示,我使用更简单的例子。我的目标是不使用联接和CTE,所有这些都是在单个查询或其他魔术函数中完成的(可能是EXISTS?)。感谢您的帮助!

enter image description here

1 个答案:

答案 0 :(得分:2)

left join简洁,优雅,高效:

select c.*, (case when a.customerid is null then 0 else 1 end) as has_age
from @customer c left join
     @age a
     on c.customerid = a.customerid;

也就是说,这样的查询通常使用case when exists编写,以防多个行匹配:

select c.*
       (case when exists (select 1 from @age a where c.customerid = a.customerid)
             then 1 else 0
        end) as has_age
from @customer c;

这也是优雅,简洁和高效的。如果您知道最多只有一行匹配,那么很多人会更喜欢left join版本。就个人而言,我是中立的。

当我说"高效"时,我的意思是性能是最好的。要获得真正的性能,您需要age(customerid)上的索引。两个查询都可以使用这样的索引。