![](/img/trans.png)
[英]DB2 for i SQL delete rows in 2 tables joined by foreign key using child value
[英]Get record for a key but display value for a separate key in DB2 SQL
所以我有一个表,其中包含 SHIP# 和 REF# 的复合主键。 每个 SHIP# 有两个 REF# 代码,即 BM 和 PO。 BM 字段是强制性的,但 PO 字段仅在用户实际输入内容时才会填充。 因此,基本的 select 将显示如下内容:
SHIP# REF# VALUE
000002 BM 20001836
000002 PO 020
000003 BM 20001834
000003 PO 8-694
000004 BM 20001835
现在,您会注意到货件 000004 只有 BM,没有 PO。
我想显示所有带有 PO 值的货件。 因此,如果 PO 值为空或不存在(如“000004”),则应简单地输入“-”。 由于 BM 是强制性的,您必须获取 BM 存在但显示 PO 字段值的所有记录。
所以,output 应该是:
SHIP# REF# VALUE
000002 PO 020
000003 PO 8-694
000004 PO -
如果您需要更多说明,请告诉我。 谢谢。
您可以使用聚合:
select ship#, 'PO' as ref#,
max(case when ref# = 'PO' then value end) as value
from t
group by ship#
这将返回NULL
的value
——这似乎是一个非常好的选择。 如果您真的想要'-'
,请使用COALESCE()
:
select ship#, 'PO' as ref#,
coalesce(max(case when ref# = 'PO' then value end), '-') as value
from t
group by ship#
针对自身的外部连接也可以完成这项工作。 例如:
select a.ship, 'PO' as ref, coalesce(b.value, '-') as value
from t a
left join t b on b.ship = a.ship and b.ref = 'PO'
where a.ref = 'BM'
结果:
SHIP REF VALUE
------ --- -----
000002 PO 020
000003 PO 8-694
000004 PO -
请参阅db<>fiddle的运行示例。
编辑 - 只查找没有 PO 的 BM。
您可以使用相同的查询并添加额外的谓词and b.ship is null
,如下所示:
select a.ship, 'PO' as ref, coalesce(b.value, '-') as value
from t a
left join t b on b.ship = a.ship and b.ref = 'PO'
where a.ref = 'BM'
and b.ship is null
结果:
SHIP REF VALUE
------- ---- -----
000004 PO -
请参阅db<>fiddle的运行示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.