SQL Query实现某种带有额外条件的Left / Right Join

问题描述 投票:0回答:2

我正在使用MS Navision,并且有以下情况。

2个表格如下图所示,需要生成下面显示为“Desired”的结果。为了使用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中实现逻辑?

谢谢

c# sql navision
2个回答
0
投票

这样做的诀窍:

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

第一个(错误的)答案

除了你在Desired-table中显示的东西之外,所需的东西似乎不是什么?看起来像下面的查询:

SELECT Table1.Cluster 
FROM Table1 
    LEFT JOIN Table2 ON (Table1.Cluster = Table2.Cluster AND Table1.OGE = Table2.OGE)
WHERE Table2.Cluster IS NULL

0
投票

使用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;
© www.soinside.com 2019 - 2024. All rights reserved.