[英]SQL Query to achieve some kind of Left/Right Join with an extra condition
我正在與MS Navision合作,並且遇到以下情況。
2個表格如下圖所示,並且需要產生您在下方看到的“所需”結果。 為了識別具有NULL值的行並將其顯示在報告中,這是必需的:
表格1
+---------+-------+
| Cluster | OGE |
+---------+-------+
| B1309 | A |
| B1309 | B |
+---------+-------+
表2
+--------+---------+-----+
| Type | Cluster | OGE |
+--------+---------+-----+
| Liniar | B1309 | A |
| 44 | B1309 | A |
| 44 | B1309 | B |
+--------+---------+-----+
期望
+---------+-----+---------+---------+--------+
| Cluster | OGE | Type | Cluster | OGE |
+---------+-----+---------+---------+--------+
| B1309 | A | Liniar | B1309 | A |
| B1309 | B | Liniar | NULL | NULL |
| B1309 | A | 44 | B1309 | A |
| B1309 | B | 44 | B1309 | B |
+---------+-----+---------+---------+--------+
為了識別表1中哪些記錄在表2中沒有每種類型的對應條目,這是必需的
我的表可以有成千上萬的行,所以這就是為什么我想找到一種有效的方法來識別此行,而不用循環拋出每一行。
您至少知道如何在SQL Server或編程語言中實現這種功能,也許我可以在NAV中實現邏輯?
謝謝
這可以解決問題:
SELECT tmp.*, t2.*
FROM (SELECT * FROM Table1 t1a, (SELECT DISTINCT [Type] FROM Table2) t2a) tmp
LEFT JOIN Table2 t2 ON (tmp.Cluster = t2.Cluster AND tmp.OGE = t2.OGE AND tmp.Type = t2.Type)
然后只有您需要的結果:
SELECT tmp.*
FROM (SELECT * FROM Table1 t1a, (SELECT DISTINCT [Type] FROM Table2) t2a) tmp
LEFT JOIN Table2 t2 ON (tmp.Cluster = t2.Cluster AND tmp.OGE = t2.OGE AND tmp.Type = t2.Type)
WHERE t2.Cluster IS NULL
第一個(錯誤)答案
期望的似乎不同於您在“期望表”中顯示的東西? 看起來以下查詢將執行此操作:
SELECT Table1.Cluster
FROM Table1
LEFT JOIN Table2 ON (Table1.Cluster = Table2.Cluster AND Table1.OGE = Table2.OGE)
WHERE Table2.Cluster IS NULL
使用cross join
生成行,使用left join
引入匹配的值:
select og.cluster, og.OGE, t.type,
t2.cluster, t2.OGE
from table1 og cross join
(select distinct type form table2) t left join
table2 t2
on t2.cluster = og.cluster and
t2.OGE = og.OGE and
t2.type = t.type;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.