是否可以限制外连接的结果?
问题描述:
我有一个场景,我需要在三个表中进行连接。是否可以限制外连接的结果?
table #1 is a list of users table #2 contains users who have trait A table #3 contains users who have trait B
如果我想找到所有谁具有性状A或性状B(在一个简单的SQL),我觉得我坚持的用户。
如果我定期加入,那么没有特质A的人将不会出现在结果集中以查看他们是否具有特质B(反之亦然)。 但是,如果我从表1到表2和3进行外部联接,我将得到表1中的所有行,而不管我的where子句的其余部分如何指定对表2或3的要求。
在您上来之前有多个sqls和临时表以及什么,这个程序要复杂得多,这只是简单的情况。它动态创建基于大量外部因素的SQL,所以我试图让它在一个SQL中工作。 我期望有可以工作的in或exists的组合,但我希望有一些简单的事情。 但基本上外连接总是会产生表1的所有结果,是的?
答
SELECT *
FROM table1
LEFT OUTER
JOIN table2
ON ...
LEFT OUTER
JOIN table3
ON ...
WHERE NOT (table2.pk IS NULL AND table3.pk IS NULL)
,或者如果你想成为偷偷摸摸:
但对你而言,我只是建议:
SELECT *
FROM table1
WHERE table1.pk IN (SELECT fk FROM table2)
OR table1.pk IN (SELECT fk FROM table3)
或可能更有效:
SELECT *
FROM table1
WHERE table1.pk IN (SELECT fk FROM table2 UNION (SELECT fk FROM table3)
答
我想你可以在这里做一个联盟。
答
可能,我建议:
SELECT columnList FROM Table1 WHERE UserID IN (SELECT UserID FROM Table2)
UNION
SELECT columnList FROM Table1 WHERE UserID IN (SELECT UserID FROM Table3)
答
如果你真的只是想有一个特质或其他,那么用户的列表:
SELECT userid FROM users
WHERE userid IN (SELECT userid FROM trait_a UNION SELECT userid FROM trait_b)
对于外连接而言,longneck的回答看起来像什么我正处于写作过程中。
答
会这样的工作?记住根据表的大小,左外连接在性能方面可能非常昂贵。
Select *
from table1
where userid in (Select t.userid
From table1 t
left outer join table2 t2 on t1.userid=t2.userid and t2.AttributeA is not null
left outer join table3 t3 on t1.userid=t3.userid and t3.AttributeB is not null
group by t.userid)
答
如果你想要的是用户的那么
SELECT UserId From Table2
UNION
SELECT UserId From Table3
的ID是完全足够了。
如果你想从表1对这些用户的一些相关信息,您可以加入上SQL表1:
SELECT <list of columns from Table1>
FROM Table1 Join (
SELECT UserId From Table2
UNION
SELECT UserId From Table3) User on Table1.UserID = Users.UserID