Sql 联接两个表,但只返回表1中与表2匹配的行

Sql 联接两个表,但只返回表1中与表2匹配的行,sql,sql-server,join,Sql,Sql Server,Join,你好 我有两个表需要连接,转移消费税Tbl和值输入 转移消费税Tbl:No必须与值输入表中的项目编号匹配。我做了一个比较,没有在转移消费税的项目是在价值输入,并发现了一些 转移消费税待定: Starting Date No_ Excise Location Location Code Unit Rate Excise Type Code Unit Of Measure Code Li

你好 我有两个表需要连接,转移消费税Tbl和值输入


转移消费税Tbl:No必须与值输入表中的项目编号匹配。我做了一个比较,没有在转移消费税的项目是在价值输入,并发现了一些

转移消费税待定:

Starting Date           No_                  Excise Location Location Code Unit Rate                               Excise Type Code Unit Of Measure Code Litre Conversion Factor
----------------------- -------------------- --------------- ------------- --------------------------------------- ---------------- -------------------- ---------------------------------------
2013-02-28 00:00:00.000 600011263            NONBOND         ~DUTY PAID    2.70000000000000000000                  UWNEPACK         LITRES               1.33333000000000000000  
2014-02-27 00:00:00.000 600011263            NONBOND         ~DUTY PAID    2.87000000000000000000                  UWNEPACK         LITRES               1.33333000000000000000  
2015-02-26 00:00:00.000 600011263            NONBOND         ~DUTY PAID    3.07000000000000000000                  UWNEPACK         LITRES               1.33333000000000000000  
2016-02-25 00:00:00.000 600011263            NONBOND         ~DUTY PAID    3.31000000000000000000                  UWNEPACK         LITRES               1.33333000000000000000
值输入表:

Item No_             Location Code Gen_ Bus_ Posting Group Invoiced Quantity
-------------------- ------------- ----------------------- ---------------------------------------
F00330               VINI          EXSA                    -10.00000000000000000000  
F00331               VINI          EXSA                    -30.00000000000000000000  
F00332               VINI          EXSA                    -40.00000000000000000000  
我想编写查询以排除重复项,因为下面的脚本仍然会创建重复项。主键是项目编号,FK是位置代码。您将在转移消费税表中看到,每年为特定项目和地点提供一个新的单价

SELECT DISTINCT a.[Starting Date],  
    b.[Posting Date], 
    b.[Item No_],  
    b.[Invoiced Quantity],  
    a.[Litre Conversion Factor], 
    a.[Unit Rate] , 
    a.[Location Code],  
    a.[Excise Location], 
    a.[Excise Type Code], 
    a.[Unit Of Measure Code]
FROM [Transfer Excise Tbl] a JOIN [Spier Live$Value Entry] b
ON a.[No_] = b.[Item No_] 
WHERE  b.[Posting Date] > '2013-02-26 '
AND b.[Location Code] = a.[Location Code]
AND b.[Gen_ Bus_ Posting Group] IN ('LOCA','EXSA')
AND b.[Posting Date] >= a.[Starting Date]
AND b.[Invoiced Quantity] <>0

首先,您的[Value Entry]表有问题

1在您的查询中,您指的是[Posting Date]列,但示例数据中没有此类列

现在,如果我已经很好地理解了这个场景,我认为您的问题与如何连接两个表中的行有关

我得到的行数比您预期的要多,因为您将[Value Entry]中的每一行与[Transfer Coxe Tbl]中的所有行合并,并使用较旧的[Start Date],而不仅仅是最后一个有效行

要解决此问题,您应该预先计算[转移消费税Tbl]行的有效期,找到每行的[结束日期],然后 在[开始日期]和[结束日期]之间加入b[过帐日期]

最终查询将类似于:

;WITH
EndDates as (-- add [End Date] to [Transfer Excise Tbl]
    select t1.*, ISNULL([End Date], CONVERT(date, '9999-12-31', 121)) [End Date]
    from [Transfer Excise Tbl] t1
    outer apply (
        select MIN([Starting Date]) [End Date]
        from [Transfer Excise Tbl]
        where [Starting Date] > t1.[Starting Date]
    ) T2
)
SELECT DISTINCT a.[Starting Date],  
    b.[Posting Date], 
    b.[Item No_],  
    b.[Invoiced Quantity],  
    a.[Litre Conversion Factor], 
    a.[Unit Rate] , 
    a.[Location Code],  
    a.[Excise Location], 
    a.[Excise Type Code], 
    a.[Unit Of Measure Code]
FROM [EndDates] a JOIN [Spier Live$Value Entry] b ON a.[No_] = b.[Item No_] AND b.[Posting Date] BETWEEN a.[Starting Date] AND a.[End Date]
WHERE  b.[Posting Date] > '2013-02-26 '
AND b.[Location Code] = a.[Location Code]
AND b.[Gen_ Bus_ Posting Group] IN ('LOCA','EXSA')    
AND b.[Invoiced Quantity] <> 0
它应该只返回您期望的行数


我希望这有帮助

您能添加一些DDL并发布预期结果吗?我无法内联这些图像,因为图像在我的域中被阻止。您能内联它们吗?传输附加税Tbl:否必须与值输入表中的项否匹配:在我看来,联接正是这样做的。有什么问题吗?@Kevin我得到的行数比预期的多,因为我在Navision的最终结果给了我不同的行数rows@Kevin,转移消费税Tbl中没有与价值分录中的项目号不匹配的项目,并且价值分录中的项目号与转移消费税Tbl中的项目号不匹配。如果数字不匹配,它将给出一个空值,这意味着该项目没有交易。我需要避免这种情况NULLS@Kevin,我做了一个DDL来向你展示我的最终结果,我需要得到什么,我如何将它粘贴到这个页面上,以便你可以查看它