我需要从ID可能不存在的表中获取ID列表和相应字段。例如,表格如下:
id | status
-------------
1234 | A
4567 | B
1020 | C
我希望从id=4567
和id=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的行,即使它没有记录,该怎么办?
答案 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上的语法不同。