【问题标题】:SQL: LEFT OUTER JOIN not returning any rowsSQL:左外连接不返回任何行
【发布时间】:2016-06-14 16:18:03
【问题描述】:

我有一个使用 LEFT OUTER JOIN 合并 2 个数据集的查询。我知道两个数据集都应该返回数据,因为我分别运行了超级查询和子查询。由于某种原因,查询返回零结果。有人知道为什么吗?

左数据:

item        FG_lots
447845      E2211

正确的数据:

candy_lot_check    candy_item
L2211              835116

预期结果:

item        FG_lots   candy_lot_check    candy_item
447845      E2211     null               null

我的错误查询的结果(没有结果):

item        FG_lots   candy_lot_check    candy_item

查询:

--Initialization--
DECLARE @Item NVARCHAR(30) = '447845'
DECLARE @Date datetime = '6/13/2016'
SET DATEFIRST 1;

DECLARE @client NVARCHAR(20)
SET @client = (SELECT i.Uf_ClientName FROM item AS i WHERE i.item = @Item)

DECLARE @count integer

--Query--
SET @count = (CASE 

                WHEN (@client = 'A' OR @client = 'B')
                    THEN 4 
                WHEN @client = 'C'
                    THEN 3
                WHEN @client = 'D' 
                    THEN 5
                ELSE
                    4
              END)


SELECT DISTINCT

    t.item,
    LEFT(t.lot,@count) AS FG_lots,
    (CASE
        WHEN candylot.candy_lots IS NULL
        THEN 'NO MATCH'
        ELSE candylot.candy_lots
    END) AS candy_lot_check,
    (CASE
        WHEN candylot.item IS NULL
        THEN 'NO MATCH'
        ELSE candylot.item
    END) AS candy_item


FROM

    ISW_LPTrans AS t
    LEFT OUTER JOIN

        (
            SELECT

                t.item,
                LEFT(t.lot,@count) AS candy_lots,
                t.ref_num AS job,
                t.ref_line_suf AS suffix

            FROM

                ISW_LPTrans AS t
                INNER JOIN item AS i on i.item = t.item

            WHERE

                i.product_code = 'RM-Candy' AND
                t.trans_date = @Date AND
                t.trans_type = 'I' AND
                t.ref_num IN

                    (
                        SELECT TOP 1

                            j.job

                        FROM

                            job AS j

                        WHERE

                            j.item = @Item AND
                            j.job_date = (SELECT DATEADD(DAY, 1-DATEPART(WEEKDAY, @Date), @Date))

                        ORDER BY

                            j.job

                    ) 

                AND t.ref_line_suf IN

                    (

                        SELECT TOP 1

                            j.suffix

                        FROM

                            job AS j

                        WHERE

                            j.item = @Item AND
                            j.job_date = (SELECT DATEADD(DAY, 1-DATEPART(WEEKDAY, @Date), @Date))       

                    ) 

            GROUP BY

                t.item,
                t.lot,
                t.ref_num,
                t.ref_line_suf

            ) AS candylot ON LEFT(t.lot, @count) = candylot.candy_lots 

WHERE

    t.ref_num = candylot.job AND
    t.ref_line_suf = candylot.suffix AND                    
    t.trans_type = 'F' AND
    t.item = @Item AND
    t.trans_date = @Date

【问题讨论】:

  • 您的where 子句将left join 变成inner join。第二个表上的所有条件都应该在on 子句中。
  • 击败我@GordonLinoff
  • 为什么我被否决了? :(
  • 我没有投反对票,但我想说这可能是因为你没有尝试逐部分运行查询,没有where(你应该做的第一件事),看看为什么它没有返回任何行。
  • @GordonLinoff 就是这样。随意写它作为答案。

标签: sql sql-server join left-join


【解决方案1】:

您有两个“t”别名,请尝试更改它。

看来你可以重写它以使其更具可读性(joinwise,而不是 indentwise),也可能是逻辑中的某些地方不正确

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    相关资源
    最近更新 更多