我正在使用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中实现逻辑?
谢谢
这样做的诀窍:
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
使用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;