我有一个名为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')
和另一个名为Age的表,它有两列,CustomerID和Age。
declare @age table (CustomerID INT, Age INT)
INSERT INTO @Age VALUES (1, 20), (2, 19), (3, 12), (6, 30)
现在,我想在Customer表上添加一个名为HasAge的列,如果Customer表中的CustomerID也存在于Age表中,则返回1,否则返回0.
我尝试使用左连接和CTE来获得结果。所以我想知道是否有另一种方法(不使用连接)。例如。在select语句中使用子查询。实际上对我来说真实的情况更复杂。为了演示,我使用更简单的例子。我的目标是不使用联接和CTE,所有这些都是在单个查询或其他魔术函数中完成的(可能是EXISTS?)。感谢您的帮助!
答案 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)
上的索引。两个查询都可以使用这样的索引。