如何从tableA中获取tableB中左外连接和whereB条件的所有记录?
基本上,我想要的是,如果在'X'类型的tableB中有一条记录,我希望看到它,否则我不需要,但我希望tableA中的所有记录。如何从tableA中获取tableB中左外连接和whereB条件的所有记录?
我知道我可以通过将tableB.type ='X'放在LEFT OUTER JOIN ON子句中来实现这一点,但是我不能这样做,因为我仅限于使用where条件,因为我是使用一个程序的受限查询管理器我不会命名,但我绝对讨厌。 :)
SELECT *
FROM tableA
LEFT OUTER JOIN ON tableA.ID = tableB.ID
WHERE tableB.type = 'X'
我该如何做到这一点?
编辑
我试过,但我仍然没有从表A获得的所有记录。我正在SQL服务器上测试这一点,以避免等待很长时间才能使我的查询在生产系统上运行。如果有帮助,我很确定生产系统正在使用Oracle。
SELECT *
FROM tableA LEFT OUTER JOIN ON tableA.ID = tableB.ID
WHERE tableB.type = 'X' OR tableB.type IS NULL
TableB中检查null
S:
SELECT *
FROM tableA LEFT OUTER JOIN ON tableA.ID = tableB.ID
WHERE tableB.type = 'X'
OR tableB.type IS NULL
,将让你一切从两个表时加入比赛,一切从表A时,有TableB中没有相应的记录。
如果type
可以null
自然,你要的条件更改为更具声音:
SELECT *
FROM tableA LEFT OUTER JOIN ON tableA.ID = tableB.ID
WHERE tableB.type = 'X'
OR tableB.ID IS NULL
假设ID
是主键,不能null
自然会得到同样的结果。
不知道,如果你有对数据库的访问,或者如果你要查询tableB的专由于其他限制,但您始终可以创建一个名为tableBTypeX的表b视图,其中视图仅限于类型为= x的行。然后你可以将外连接留给tableBTypeX。在你的查询中,连接列是ID列,因此它们可能具有索引,使得查询在速度方面很好。在未对连接列进行索引的情况下,加入视图会更有效率,因为连接的行数更少,并且对未指定索引的行进行连接通常需要全表扫描,这使得查询更耗时。
您可能可以使用内联视图,而不是全视图。 – 2009-09-28 17:27:45
UNION可能吗?
SELECT *
FROM tableA
LEFT OUTER JOIN ON tableA.ID = tableB.ID
WHERE tableB.type = 'X'
UNION
SELECT *
FROM tableA
...或CTE?不知道名字怎么会tableB的解决,虽然并不能测试...
;WITH tableB AS
(
SELECT * FROM tableB WHERE type = 'X'
)
SELECT *
FROM
tableA
LEFT OUTER JOIN
tableB ON tableA.ID = tableB.ID
+1用于说明类型可能是一个NULL值 – RedFilter 2009-09-28 16:53:29
在这些情况下的情况下,我总是试图比较主键“ IS NULL“ - 这是此答案中的第二个SQL代码片段。 – 2009-09-28 16:58:18
这在SQL Server中不起作用。 where子句引用tableb将内部连接更改为内部连接。当我添加where子句时,它只给我提供了我在查看的字段中有空的记录。如果我把它放在ID字段上,我仍然得到了错误的答案 – HLGEM 2009-09-28 17:30:41