0

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

表 #1 是用户列表
表 #2 包含具有特征 A 的用户
表 #3 包含具有特征 B 的用户

如果我想找到所有具有特征 A 或特征 B 的用户(在一个简单的 sql 中),我想我被卡住了。

如果我进行常规加入,则没有特征 A 的人不会出现在结果集中以查看他们是否具有特征 B(反之亦然)。但是,如果我从表 1 到表 2 和表 3 进行外部联接,我将获得表 1 中的所有行,而不管 where 子句的其余部分指定了对表 2 或表 3 的要求。

在你想出多个 sql 和临时表等等之前,这个程序要复杂得多,这只是简单的例子。它根据许多外部因素动态创建 sql,所以我试图让它在一个 sql 中工作。我希望有 in 或 exists 的组合会起作用,但我希望一些简单的事情。但基本上外连接总是会产生表 1 中的所有结果,是吗?

4

6 回答 6

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)
于 2009-10-15T20:44:23.713 回答
2

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

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

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

于 2009-10-15T20:45:34.533 回答
1

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

于 2009-10-15T20:44:46.500 回答
1

我可以建议:

SELECT columnList FROM Table1 WHERE UserID IN (SELECT UserID FROM Table2)
UNION
SELECT columnList FROM Table1 WHERE UserID IN (SELECT UserID FROM Table3)
于 2009-10-15T20:45:04.347 回答
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) 
于 2009-10-15T20:46:02.473 回答
1

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

SELECT UserId From Table2
UNION
SELECT UserId From Table3

完全足够了。

如果您想从表 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
于 2009-10-15T21:40:32.560 回答