SQL 连接缺少的行

Posted

技术标签:

【中文标题】SQL 连接缺少的行【英文标题】:SQL Join Missing Rows 【发布时间】:2021-09-20 18:16:46 【问题描述】:

我有两张桌子。两者具有相同的列名,一个是模板 ([BaseDipline]),另一个是填充了真实数据的表 ([vwDipLinePackingActivity_Summary])。我想加入它们,以便模板表上的数量与真实表上的数量匹配。

模板表:

Packing Station PackDate Shift Qty
Dip Line 1 09-20-2021 1 0
Dip Line 1 09-20-2021 2 0
Dip Line 1 09-20-2021 3 0
Dip Line 2 09-20-2021 1 0
Dip Line 2 09-20-2021 2 0
Dip Line 2 09-20-2021 3 0
Dip Line 3 09-20-2021 1 0
Dip Line 3 09-20-2021 2 0
Dip Line 3 09-20-2021 3 0
Dip Line 4 09-20-2021 1 0
Dip Line 4 09-20-2021 2 0
Dip Line 4 09-20-2021 3 0

真实数据表:

Packing Station PackDate Shift Qty
Dip Line 1 09-20-2021 1 1180
Dip Line 1 09-20-2021 3 555
Dip Line 3 09-20-2021 1 762
Dip Line 3 09-20-2021 3 1005
Dip Line 4 09-20-2021 1 1792
Dip Line 4 09-20-2021 3 704

下面是我的代码。

DECLARE @Date VARCHAR(100)=CONVERT(varchar,getdate(),110)

SELECT 
    [MKE_PSS].[dbo].[BaseDipline].PackingStation, 
    [MKE_PSS].[dbo].[vwDipLinePackingActivity_Summary].PackDate,
    [MKE_PSS].[dbo].[BaseDipline].[Shift],
    [MKE_PSS].[dbo].[vwDipLinePackingActivity_Summary].Qty
FROM
    [MKE_PSS].[dbo].[BaseDipline]
INNER JOIN 
    [MKE_PSS].[dbo].[vwDipLinePackingActivity_Summary] 
         ON [MKE_PSS].[dbo].[BaseDipline].PackingStation = [MKE_PSS].[dbo].[vwDipLinePackingActivity_Summary].PackingStation
         AND [MKE_PSS].[dbo].[BaseDipline].[Shift] = [MKE_PSS].[dbo].[vwDipLinePackingActivity_Summary].[Shift]
WHERE 
    [MKE_PSS].[dbo].[vwDipLinePackingActivity_Summary].PackDate = @Date
ORDER BY
    PackingStation

预期结果:

Packing Station PackDate Shift Qty
Dip Line 1 09-20-2021 1 1180
Dip Line 1 09-20-2021 2 0
Dip Line 1 09-20-2021 3 555
Dip Line 2 09-20-2021 1 0
Dip Line 2 09-20-2021 2 0
Dip Line 2 09-20-2021 3 0
Dip Line 3 09-20-2021 1 762
Dip Line 3 09-20-2021 2 0
Dip Line 3 09-20-2021 3 1005
Dip Line 4 09-20-2021 1 1792
Dip Line 4 09-20-2021 2 0
Dip Line 4 09-20-2021 3 704

相反,我得到以下输出,其中缺少模板中应该存在的行:

output

另一张图片来解释我正在尝试做的事情(R 是真实数据,T 是我正在尝试移动数据的模板表): Expected

【问题讨论】:

没有样本数据,有点难以猜测发生了什么。 请use text, not images/links, for text--including tables & ERDs。转述或引用其他文本。只提供您需要的东西并将其与您的问题联系起来。仅将图像用于无法表达为文本或增强文本的内容。在图像中包含图例/键和说明。将需要询问的内容放入您的帖子中,而不仅仅是在链接中。 请在代码问题中给出minimal reproducible example--剪切&粘贴&运行代码;具有期望和实际输出的示例输入(包括逐字错误消息);标签和版本;明确的规范和解释。对于包含最少代码的错误,您可以给出的代码是您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于 SQL 包括 DDL 和表格初始化代码。当你得到一个你不期望的结果时,暂停你的总体目标,切到第一个具有意外结果的子表达式并说出你的期望和原因,并通过文档证明是合理的。 How to AskHelp center 更新了额外的信息.. 你在内部加入你的表 - 所以你只有两个匹配的行;你想要 BaseDipline 表中的所有行,所以你需要外连接。 【参考方案1】:

您需要使用outer join 条件。你的基表是左边的输入,你应该 left join 到你的第二个表:

select b.PackingStation, b.PackDate, b.[Shift], IsNull(s.Qty, b.Qty) Qty
from dbo.BaseDipline b
left join dbo.vwDipLinePackingActivity_Summary s
     on s.PackingStation=b.PackingStation
    and s.[shift]=b.[shift]
    and s.PackDate=@date

【讨论】:

谢谢。快速提问,有没有办法修改这个查询,以便对于 = 2 的 Shift 列中的所有内容,可以将不同的变量用于日期? 你为什么放弃那些对象的模式?模式限定对象是一种最佳做法。 @Stu 将最后一位更改为:and ((s.PackDate = @date and s.Shift in ('1', '3')) or (s.packDate = @previousDate and s.Shift = '2')) @SMor 是的,你是对的 - 我只是打算省略不必要的数据库 3 部分名称;这只是我本地测试环境的自动格式化,我已经添加了架构。 @alfonso2330 是的,根据您的要求,您可能希望将isnull 用于日期列,如数量列。

以上是关于SQL 连接缺少的行的主要内容,如果未能解决你的问题,请参考以下文章

在 Redshift 中获取缺少 id 的行

调试代码签名和配置文件部分中缺少的行

ORA-00907: SQL 中的自然连接缺少右括号

连接缺少值的 SQL 视图

Hive SQL 多个左外连接查询在其结果中缺少记录

更新 ORA-00971 时左连接:缺少 SET 关键字 SQL [重复]