如何从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自然会得到同样的结果。

+0

+1用于说明类型可能是一个NULL值 – RedFilter 2009-09-28 16:53:29

+0

在这些情况下的情况下,我总是试图比较主键“ IS NULL“ - 这是此答案中的第二个SQL代码片段。 – 2009-09-28 16:58:18

+0

这在SQL Server中不起作用。 where子句引用tableb将内部连接更改为内部连接。当我添加where子句时,它只给我提供了我在查看的字段中有空的记录。如果我把它放在ID字段上,我仍然得到了错误的答案 – HLGEM 2009-09-28 17:30:41

您可以完全通过修正连接条件免受tableB的的“X型”记载:

SELECT 
    * 
FROM 
    tableA 
    LEFT OUTER JOIN ON 
    tableA.ID = tableB.ID 
    AND tableB.type = 'X' 
+0

他特别说它不能在ON子句中完成,但必须在WHERE子句中完成。 – RedFilter 2009-09-28 16:54:45

+1

该OP提到他不能修改加入声明。 – 2009-09-28 16:55:48

+0

Aww,快照。你是对的,他做到了。 – Tomalak 2009-09-28 16:57:29

不知道,如果你有对数据库的访问,或者如果你要查询tableB的专由于其他限制,但您始终可以创建一个名为tableBTypeX的表b视图,其中视图仅限于类型为= x的行。然后你可以将外连接留给tableBTypeX。在你的查询中,连接列是ID列,因此它们可能具有索引,使得查询在速度方面很好。在未对连接列进行索引的情况下,加入视图会更有效率,因为连接的行数更少,并且对未指定索引的行进行连接通常需要全表扫描,这使得查询更耗时。

+0

您可能可以使用内联视图,而不是全视图。 – 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