【发布时间】: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