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

时间:2009-10-15 20:41:13

标签: sql outer-join

我有一个场景,我需要跨三个表进行连接。

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中的所有结果,是吗?

6 个答案:

答案 0 :(得分:3)

SELECT *
  FROM table1
LEFT OUTER
  JOIN table2
    ON ...
LEFT OUTER
  JOIN table3
    ON ...
 WHERE NOT (table2.pk IS NULL AND table3.pk IS NULL)

或者如果你想偷偷摸摸:

 WHERE COALESCE(table2.pk, table3.pk) IS NOT 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)

答案 1 :(得分:2)

如果您真的只想要具有一个特征或另一个特征的用户列表,那么:

SELECT userid FROM users
  WHERE userid IN (SELECT userid FROM trait_a UNION SELECT userid FROM trait_b)

特别是关于外连接,longneck的答案看起来就像我在写作中的那样。

答案 2 :(得分:1)

我想你可以在这里做一个UNION。

答案 3 :(得分:1)

我可以建议:

SELECT columnList FROM Table1 WHERE UserID IN (SELECT UserID FROM Table2)
UNION
SELECT columnList FROM Table1 WHERE UserID IN (SELECT UserID FROM Table3)

答案 4 :(得分:1)

这样的事情会起作用吗?请记住,根据表的大小,左外连接在性能方面可能非常昂贵。

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) 

答案 5 :(得分:1)

如果您想要的只是用户的ID,那么

SELECT UserId From Table2
UNION
SELECT UserId From Table3

完全足够了。

如果您希望这些用户使用Table1中的更多信息,您可以将上层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