![](/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.