【发布时间】:2015-05-13 17:25:59
【问题描述】:
几天前,我询问如何将 OR 条件(左连接)更改为另一个左连接。下面是代码:
SELECT *
FROM Table1 t1
LEFT JOIN Table2 t2
ON t1.ID = t2.ID
OR (
t1.col1 = t2.col1
AND t1.col2 = t2.col2
AND t1.col3 = t2.col3
AND t2.ID IS NULL
)
我转换为 OR 条件如下:
SELECT *
FROM Table1 t1
LEFT JOIN Table2 t2
ON t1.ID = t2.ID
LEFT JOIN Table2 t3
ON (
t1.col1 = t3.col1
AND t1.col2 = t3.col2
AND t1.col3 = t3.col3
AND t2.ID IS NULL
)
但是我没有在单独的行中获得第二个左连接的记录。
带有OR条件的结果是这样的:
T1.ID T2.ID
1 a
2 b
3 c
4 d
但是在左下角加入它的下面:
T1.ID T2.ID
1 a
2 b
3 c
第 4 条记录来自第二个左连接。我怎样才能把它带入左连接。我没有按照公司标准使用 UNION ALL 的选项。
请帮忙。
谢谢
【问题讨论】:
-
当您向查询中添加另一个表时,它不会自动生成新行。听起来您在一个表中需要两个数据集。 UNION ALL 就是您这样做的方式。很奇怪的公司标准,你不能使用 UNION ALL。关于我能想到的唯一另一件事是创建一个临时表并用两个插入语句填充它。
-
我知道这很奇怪。我也会尝试使用临时表
-
@BogdanSahlean - 你有什么其他的建议吗.. 除了 Union All
-
或条件需要超过 45 分钟.. 只是想优化它并使其更快。
-
@Ritesh Union All 和 Joins 是不同的概念。请参阅此处stackoverflow.com/questions/905379/… 的解释。另外,如果我错了,请纠正我,但上面的第一个查询(使用 OR)尝试访问 2 个表中的数据,但第二个查询包括第三个表。一旦你理解了这一点,试着分段运行你的查询,看看每个部分是否给你正确的结果。您也可以为此使用 CTE。除非我完全理解您的问题,否则我无法提供任何解决方案。
标签: sql-server sql-server-2008 tsql join