[英]Multiple self joins plus one inner join
我有兩個表: ck_startup
和ck_price
。 價格表包含cu_type
, prd_type
, part_cd
, qty
和dllrs
。 啟動表通過ck_startup.prd_type_cd = ck_price.prd_type
上的一對多關系鏈接到價格表。
價格表包含相同產品/零件/數量但在不同客戶類型下的多個條目。 並非所有客戶類型都具有這三個值的相同唯一組合。 我正在嘗試創建一個查詢,它將做兩件事:
ck_price
某些列ck_startup
到ck_price
(描述和一些其他值)。 ck_price
與每種客戶類型的dllrs
列連接ck_price
。 因此,總的來說,每個產品/零件/數量的唯一鍵只有一個實例,如果每個客戶的價格列都有一個值,那么我將只有一個實例。 我從未使用過自聯接表,到目前為止,我只能獲得記錄,以顯示兩個客戶都有相同可用選項的地方。
而且由於有人要我發布示例代碼,因此這是不顯示缺失價格的糟糕查詢:
select pa.*, pac.dllrs from ck_price pa
join ck_price pac on pa.prd_type = pac.prd_type and pa.part_carbon_cd = pac.part_carbon_cd and pa.qty = pac.qty
where pa.cu_type = 'A' and pac.cu_type = 'AC';
編輯:這是來自兩個表的示例數據,以及完成后我希望它們如何顯示:
CK_STARTUP +-----+-----------------+-------------+ | CD | DSC | PRD_TYPE_CD | +-----+-----------------+-------------+ | 3D | Stuff | SKD3 | | DC | Different stuff | SKD | | DN2 | Similar stuff | SKD | +-----+-----------------+-------------+ CK_PRICE +---------+-------------+---------+-----+-------+ | CU_TYPE | PRD_TYPE_CD | PART_CD | QTY | DLLRS | +---------+-------------+---------+-----+-------+ | A | SKD3 | 1 | 100 | 10 | | A | SKD3 | 1 | 200 | 20 | | A | SKD3 | 1 | 300 | 30 | | A | SKD | 1 | 100 | 50 | | A | SKD | 1 | 200 | 100 | | AC | SKD3 | 1 | 300 | 30 | | AC | SKD | 1 | 100 | 100 | | AC | SKD | 1 | 200 | 200 | | AC | SKD | 1 | 300 | 300 | | AC | SKD | 1 | 400 | 400 | +---------+-------------+---------+-----+-------+ COMBO: +----+-----------------+---------+-----+---------+----------+ | CD | DSC | PART_CD | QTY | DLLRS_A | DLLRS_AC | +----+-----------------+---------+-----+---------+----------+ | 3D | Stuff | 1 | 100 | 10 | null | | 3D | Stuff | 1 | 200 | 20 | null | | 3D | Stuff | 1 | 300 | 30 | 60 | | DC | Different stuff | 1 | 100 | 50 | 100 | | DC | Different stuff | 1 | 200 | 100 | 200 | | DC | Different stuff | 1 | 300 | null | 300 | | DC | Different stuff | 1 | 400 | null | 400 | +----+-----------------+---------+-----+---------+----------+
好的,看看下面的查詢和結果:
SELECT *
FROM (SELECT
cs.cd, cs.dsc, cp.part_cd, cp.qty, cp.dllrs, cp.cu_type
FROM ck_startup cs
JOIN ck_price cp ON (cs.prd_type_cd = cp.prd_type_cd))
PIVOT (SUM(dllrs) AS dlllrs FOR (cu_type) IN ('A' AS a, 'AC' AS ac))
ORDER BY cd, qty
;
輸出:
CD DSC PART_CD QTY A_DLLLRS AC_DLLLRS -------- ----------------- ---------- ------- ---------- ---------- 3D Stuff 1 100 10 3D Stuff 1 200 20 3D Stuff 1 300 30 30 DC Different stuff 1 100 50 50 DC Different stuff 1 200 100 100 DC Different stuff 1 300 150 DC Different stuff 1 400 200 DN2 Similar stuff 1 100 50 50 DN2 Similar stuff 1 200 100 100 DN2 Similar stuff 1 300 150 DN2 Similar stuff 1 400 200
這不是您所期望的,因為我不理解為什么您在CK_PRICE
表的DLLRS_AC
列中有不同的值? 我的意思是,例如,為什么輸出的最后一行有400
而不是200
? 為什么將此值加倍(因為其他值在DLLRS_AC
列中)?
如果您使用的是Oracle 10g,則可以使用DECODE
和GROUP BY
達到相同的結果,請看一下:
SELECT
cd,
dsc,
part_cd,
qty,
SUM(DECODE(cu_type, 'A', dllrs, NULL)) AS dllrs_a,
SUM(DECODE(cu_type, 'AC', dllrs, NULL)) AS dllrs_ac
FROM (
SELECT
cs.cd, cs.dsc, cp.part_cd, cp.qty, cp.dllrs, cp.cu_type
FROM ck_startup cs
JOIN ck_price cp ON (cs.prd_type_cd = cp.prd_type_cd)
)
GROUP BY cd, dsc, part_cd, qty
ORDER BY cd, qty;
結果是一樣的。
如果您想了解有關透視的更多信息,建議您閱讀Tim Hall的文章: Oracle Base的透視和反透視
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.