我需要遍历一组值(小于10)并查看它们是否在表中.如果是这样,我需要打印出所有记录值,但如果该项目不存在,我仍然希望它包含在打印结果中,尽管具有NULL或0值.因此,例如,以下查询返回:
select *
from ACTOR
where ID in (4, 5, 15);
Run Code Online (Sandbox Code Playgroud)
+ ---- + ----------------------------- ------------- + + ---------- + ------ + | ID | NAME | 描述| ORDER_ID | TYPE | + ---- + ----------------------------- ------------- + + ---------- + ------ + | 4 | [TEST-1] | | 3 | NULL | | 5 | [TEST-2] | | 4 | NULL | + ---- + ----------------------------- ------------- + + ---------- + ------ +但是我希望它能够回归
+ ---- + ----------------------------- ------------- + + ---------- + ------ + | ID | NAME | 描述| ORDER_ID | TYPE | + ---- + ----------------------------- ------------- + + ---------- + ------ + | 4 | [TEST-1] | | 3 | NULL | | 5 | [TEST-2] | | 4 | NULL | | 15 | NULL | | 0 | NULL | + ---- + ----------------------------- ------------- + + ---------- + ------ +
这可能吗?
要获得所需的输出,首先必须构造一个包含所需ACTOR.id值的派生表.UNION ALL适用于小型数据集:
SELECT *
FROM (SELECT 4 AS actor_id
FROM DUAL
UNION ALL
SELECT 5
FROM DUAL
UNION ALL
SELECT 15
FROM DUAL) x
Run Code Online (Sandbox Code Playgroud)
有了它,你可以OUTER JOIN到实际的表来获得你想要的结果:
SELECT x.actor_id,
a.name,
a.description,
a.orderid,
a.type
FROM (SELECT 4 AS actor_id
FROM DUAL
UNION ALL
SELECT 5
FROM DUAL
UNION ALL
SELECT 15
FROM DUAL) x
LEFT JOIN ACTOR a ON a.id = x.actor_id
Run Code Online (Sandbox Code Playgroud)
如果x和之间没有匹配a,则a列将为null.因此,如果你想在id 15不匹配时orderid为零:
SELECT x.actor_id,
a.name,
a.description,
COALESCE(a.orderid, 0) AS orderid,
a.type
FROM (SELECT 4 AS actor_id
FROM DUAL
UNION ALL
SELECT 5
FROM DUAL
UNION ALL
SELECT 15
FROM DUAL) x
LEFT JOIN ACTOR a ON a.id = x.actor_id
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6259 次 |
| 最近记录: |