SQL Query 从不同的表中选择相同的数据,显示所有记录,但显示/显示匹配

Posted

技术标签:

【中文标题】SQL Query 从不同的表中选择相同的数据,显示所有记录,但显示/显示匹配【英文标题】:SQL Query SELECT same data from different tables, show all records, but show / display matches 【发布时间】:2020-11-05 01:15:45 【问题描述】:

我有两个表我想比较信息(为了从初始表到另一个我需要通过参考表)。 我得到了我正在寻找的结果,除非找到匹配项时添加了额外的数据行(下面的屏幕截图)。应该只有 4 行,我不明白为什么第 1 列第 5 行中的值不只是添加到第 1 列第 4 行。

任何帮助将不胜感激。

代码

Select DISTINCT
 CASE
    WHEN LIC.ORDER_NUM = LN_STLIC.ORDER_NUMBER THEN LIC.ORDER_NUM 
    ELSE ''
END 'ORDER Number 1',
LN_STLIC.ORDER_NUMBER 'ORDER Number 2'
from LN_TABLE1 LN_STLIC 
    LEFT OUTER JOIN LN_REF LN_PDE_RTN on LN_STLIC.LNPID = LN_PDE_RTN.LNPID
    LEFT OUTER JOIN LN_TABLE2 LIC on LN_PDE_RTN.ID = LIC.ID 
where LIC.ID = '123456'

示例表数据

LN_TABLE1

LN_REF

LN_TABLE2

结果

【问题讨论】:

(1) 用您正在使用的数据库标记您的问题。 (2)你是什么意思“添加到”?您正在使用 select distinct 并且您将获得不同的行。 (3) 您的 where 子句将外连接变为内连接,因此您的查询令人困惑。 提供一些表的示例数据 @GordonLinoff,LN_REF、LN_TABLE1 和 LN_TABLE2 中有多个唯一 ID。为了减少结果的数量,我包含了 WHERE 子句,以便展示一个示例 请use text, not images/links, for text--including tables & ERDs。仅将图像用于无法表达为文本或增强文本的内容。在图像中包含图例/键和说明。请通过编辑而不是 cmets 进行澄清。 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停整体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你期望的内容和原因。 【参考方案1】:

您已将Order Number 1 定义为

CASE
    WHEN LIC.ORDER_NUM = LN_STLIC.ORDER_NUMBER THEN LIC.ORDER_NUM 
    ELSE ''
END 

因此,您可以合理地推断,当Order Number 1 为空白时,这是因为LIC.ORDER_NUMLN_STLIC.ORDER_NUMBER 不匹配。

您要求对 Order Number 1Order Number 2 的组合进行 DISTINCT。因此,出现在数据中的这两者的每个组合都只会出现一次。

因为LN_TABLE1 有四个不同的订单号对应LNPID 的相同值,所以您将生成3 条记录,其中空白Order Number 1Order Number 2 设置为210414。但distinct 将占用它减少到只有一个,加上它们匹配的一个(在您的示例中记录 4 和 5)。

您可能必须加入 LIC.ORDER_NUM = LN_STLIC.ORDER_NUMBER 才能将订单号相互匹配,并且只能获得订单号 210414 的 1 条记录。

如果我对你想要达到的目标有更多了解,我可以给你一个更好的查询。

【讨论】:

嗨,非常感谢您的回复......我理解您的描述,最终目标是让结果看起来像我在最初问题中提出的内容,除了删除第 4 行。即显示来自 LN_TABLE1 的所有结果,但是当来自 LN_TABLE1 的匹配项显示在同一行时。如果我删除 DISTINCT,它会得到更多结果,即两列的所有组合 根据这个和您的 dbfiddle 条目,您的源表中似乎有一条额外的记录——可能在 LN_REF 或 LN_TABLE2 中。 (我知道它没有出现在您的屏幕截图中,但这是最可能的解释。) 追踪它的一种方法是将各个表中的额外字段(ID 和原始订单号)添加到您的查询中,然后查看该不需要的行显示的内容。跨度> 事实上,我敢打赌它在 LN_TABLE2 中。如果我是对的,请告诉我! 很高兴听到这个消息!这能解决问题吗?如果是这样,请考虑将我的答案标记为您接受的答案。如果没有,请告诉我们还有什么需要解决的!【参考方案2】:

您的问题令人困惑:

我们可以用 LN_STLIC 和 LIC 做一个简单的 LEFT JOIN:

Select CASE WHEN LN_STLIC.order_number = LIC.order_num THEN LIC.ORDER_NUM END ORD 
Number1, LN_STLIC.order_number ORD Number2
from LN_TABLE1 LN_STLIC 
LEFT OUTER JOIN LN_TABLE2 LIC ON LN_STLIC.order_number = LIC.order_num;

如果您想使用 LIC.ID = '1234' 并且不需要使用 DISTINCT,那么执行以下操作也可以获得相同的效果。

Select
CASE WHEN LIC.ORDER_NUM = LN_STLIC.ORDER_NUMBER THEN LIC.ORDER_NUM 
ELSE ''
END ORD_NBR_1,
LN_STLIC.ORDER_NUMBER ORD_NBR_2
from #LN_TABLE1 LN_STLIC 
LEFT OUTER JOIN #LN_REF LN_PDE_RTN on LN_STLIC.LNPID = LN_PDE_RTN.LNPID
LEFT OUTER JOIN #LN_TABLE2 LIC on LN_PDE_RTN.ID = LIC.ID AND 
LN_STLIC.ORDER_NUMBER =LIC.ORDER_NUM 
;

【讨论】:

当我将数据输入到关注站点dbfiddle.uk/…时,我得到了我正在寻找的结果。 不...在网站上,我得到了我正在寻找的结果。但是当在 SSMS 中本地运行相同的查询时,我得到了原始问题中显示的结果......非常奇怪 当我使用你的第二个建议(删除不同的)时,我会得到更多的结果,即每个组合或两列。 但是,这里没有 DISTINCT 就可以正常工作:dbfiddle.uk/…。我相信我们在这里遗漏了一些东西。在您的实际数据库中的第一个表中可能还有 1 个额外的行。 试试这个:dbfiddle.uk/…

以上是关于SQL Query 从不同的表中选择相同的数据,显示所有记录,但显示/显示匹配的主要内容,如果未能解决你的问题,请参考以下文章

SQL,如何从不同的表中选择属性?

如何从 CodeIgniter 中具有相同列名的表中输出数据?

从 Sql 中的表中选择不同的日期间隔

根据sql中的条件从不同的表中选择一个值

从名称具有相同首字母的表中选择

sql 从2个不同的表中选择唯一的电子邮件,并按日期排序。