我有一个表A与表B连接,它给了我一个结果集。 我想将表C加入到前面的表中以限制结果集。但是如果这个连接没有结果,我想拥有与以前相同的结果集(不用处理C)。
你能想到在SQL中这样做吗?
答案 0 :(得分:2)
SELECT *
FROM TableA
INNER JOIN TableB
ON TableA.ID = TableB.TableAID
LEFT JOIN TableC
ON TableC.ID = TableB.TableCID
这将返回表A和表A中的所有行。 B但只有TableC中与ON标准匹配的行。
否则条件连接并不真正适用于标准SQL。如果您使用的是SQL Server,则可以执行一些存储过程逻辑来检查TableC的结果,如果没有,则只从表A和表中获取数据。 B.但这种方法是提供者特定的
答案 1 :(得分:1)
常规SQL不可能,因为它涉及逻辑。
最好的办法是制作一个小脚本,例如: (伪代码)
select * into #tmp from x inner join y inner join z where blabla;
if (exists (select * from #tmp))
BEGIN
select * from #tmp
END
else
BEGIN
select * from x inner join y where blabla;
END
编辑:
但如果我是你,我会一直使用LEFT JOIN加入C,这样你就可以看到结果是在一个还是另一个结果集中......
e.g。
select x.*, y.*, case when z.id is null then 0 else 1 end from x inner join y left join z on blabla where blabla;
但这当然假设您能够改变读取结果的代码路径。
答案 2 :(得分:0)
我在LEFT / OUTER JOIN方法中看到了一个问题。如果你这样做,你可以获得A和B中的一些结果,但不能在C中。如果我理解的是porpouse与C一起加入AB,我的意思是当与C交叉时的结果必须包括三个限制。所以@Cine解决方案适合这种情况。