【发布时间】:2013-07-25 20:23:07
【问题描述】:
我正在尝试像这样实现条件连接
declare @JoinWithT2 bit = 1;
select T1.* from T1
inner join T2 on (@JoinWithT2 = 0 or T1.Id=T2.Id)
这很好用,当我传递 @JoinWithT2 值 1 时,它使用两个表的连接给我结果,当我传递 @JoinWithT2 值 0 时,它返回 T1 忽略连接的所有结果。
这一切都很好,但我担心性能,因为上面也可以这样实现
if @JoinWithT2=0
begin
select T1.* from T1
end
else
begin
select T1.* from T1
inner join T2 on (T1.Id=T2.Id)
end
实现条件连接的最佳方法是第一个还是第二个?
我个人觉得第二个查询性能应该更好,因为它根本不涉及 T2,而第一个查询可能使用 T2
【问题讨论】:
-
它不会忽略连接。它总是加入表格。如果 JoinWithT2 = 1,那么它会进行正确的连接(在 ID 上),如果它是 0,则连接所有记录,有效地将连接变成交叉连接。这就是你想要的吗?
-
请注意,当
@JoinWithT2为 0 时,第一个查询不等同于select T1.* from T1- 相反,它成为隐式笛卡尔连接 - 请参阅 sqlfiddle.com/#!3/3f574/3跨度> -
是的。实际上,如果
@JoinWithT2值为 0,我想忽略连接 -
您确实需要定义“忽略连接”的含义。您的两个 sn-ps 给出的结果不同。
标签: sql sql-server