【问题标题】:SQL Query to achieve some kind of Left/Right Join with an extra conditionSQL Query 以实现某种带有额外条件的左/右连接
【发布时间】:2019-02-22 07:12:47
【问题描述】:

我正在与 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 中实现逻辑?

谢谢

【问题讨论】:

  • 提示:如果您在帖子中包含问题的实际文本而不是链接到手绘图像,您会得到更好的响应。
  • 嗨,好的,我现在尝试添加文本。我正在努力寻找如何编辑问题:)
  • @Andrey 在您的问题下方(左侧)应该有一个小的“编辑”链接,或者您可以点击这个edit 链接
  • 完成,感谢您的提示!
  • @Andrey desired 输出背后的逻辑是什么?为什么第二行包含 NULL?除此之外,这可能是两个表之间的简单 LEFT JOIN 甚至 INNER JOIN

标签: c# sql navision


【解决方案1】:

这就是诀窍:

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

【讨论】:

  • 这不起作用,因为它不考虑类型。所以,如果我们有 'OGE' B 用于 'Type' 44,它不会显示类型 'Liniar' 的 'OGE ' B 不存在.. 这个解决方案也是我的第一个想法,但它不是正确的解决方案
  • @Andrey 对,忽略了类型...更新了我的答案。
  • 我认为这会起作用..我担心它只能通过使用交叉连接来完成,然后将结果与 Table2 左连接......不确定是否可以使用 Navision 开发环境然而,要实现这一点,因为 Navision 查询不像 SQL Server 那样灵活。但这肯定是一个很好的解决方案..
【解决方案2】:

使用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;

【讨论】:

    猜你喜欢
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多