当不满足其中一个条件时返回行

时间:2011-07-14 13:37:08

标签: sql oracle

我需要从ID可能不存在的表中获取ID列表和相应字段。例如,表格如下:

 id  | status
-------------
1234 | A
4567 | B
1020 | C

我希望从id=4567id=7777的行中获取状态,如下所示:

Result:
 id  | status
-------------
4567 | B
7777 | 

由于没有id = 7777的记录,它应该显示一个空的状态字段。

到目前为止:通过将结果与DUAL相结合,当没有任何ID匹配记录时,我可以得到一个空行。例如:

SELECT id, status FROM DUAL LEFT OUTER JOIN mytable ON id='7777'

给出一个空行的结果:

 id  | status
-------------
     | 

但是在条件中添加有效的id只会返回一行:

SELECT id, status FROM mytable WHERE (id='7777' OR id='4567')

 id  | status
-------------
4567 | B

如果查询返回包含所请求ID的行,即使它没有记录,该怎么办?

4 个答案:

答案 0 :(得分:2)

SELECT  q.id, m.status
FROM    (
        SELECT  4567 AS id
        FROM    dual
        UNION ALL
        SELECT  7777 AS id
        FROM    dual
        ) q
LEFT JOIN
        mytable m
ON      m.id = q.id

答案 1 :(得分:0)

让外连接从表(左侧)返回值,即使其他连接表中没有相应的记录也是如此。 (右外连接是相同的,除非它从右边的表中返回数据,即使左边的表中没有相应的记录)

意味着您需要在至少一个表中包含数据才能在结果中获取数据。

实际上,这就是您获取4567数据的原因。您在左表中有一个对应于4567的记录(而不是dual)。

您在其中任何一个表中都没有7777,这就是为什么它不会出现在结果中。

这里有两种选择 一,正如@Quassnoi所说,你可以选择双重的所有记录,并与另一个表左边连接 如果您的数据是动态的或者您有大量数据,这可能不实用。 在这种情况下,您可以使用数据创建一个小临时表,然后与另一个表连接。简而言之:您需要将数据放在某处,以便您与其他表格一起使用。

答案 2 :(得分:0)

使用RIGHT OUTER JOIN代替LEFT OUTER JOIN

答案 3 :(得分:0)

使用临时表,存储4567和7777或适当的查询,您可以进行联合:

SELECT DISTINCT n, '' 
  FROM tmp, tbl 
  WHERE n NOT IN (SELECT id FROM tbl) 
UNION (
SELECT id, status 
  FROM tmp, tbl 
  WHERE n=id);

我在postgresql上测试过 - 它可能与oracle上的语法不同。