是否可以限制外连接的结果?

问题描述:

我有一个场景,我需要在三个表中进行连接。是否可以限制外连接的结果?

 
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