2016-06-14 2 views
-1

У меня есть запрос, который использует LEFT OUTER JOIN для объединения двух наборов данных. Я знаю, что оба набора данных должны возвращать данные, потому что я запускал суперзапрос и подзапрос отдельно. По какой-то причине запрос возвращает нулевые результаты. Кто-нибудь знает, почему?SQL: LEFT OUTER JOIN не возвращает никаких строк

левые данные:

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 
+5

Ваш 'where' положение поворачивает влево' join' в «внутреннее соединение». Все условия во второй таблице должны быть в разделе 'on'. –

+0

избили меня @GordonLinoff –

+0

Почему я получил downvoted? :( – whatwhatwhat

ответ

0

У вас есть алиасы два 'T', попробуйте изменить его.

Кажется, вы могли бы переписать его, чтобы сделать его более удобным для чтения (joinwise, не indentwise), это может быть что-то не так в логике, а

Смежные вопросы