Проблема с Join - PullRequest
       19

Проблема с Join

0 голосов
/ 27 июня 2019

У меня есть две таблицы в макете основной детали.Я хочу выбрать все активные элементы из основной таблицы и подробные записи, только если они удовлетворяют условию.Но я хочу, чтобы все элементы мастер-таблицы, независимо от того, существует ли подробная запись, существуют или нет.

Мои таблицы выглядят следующим образом: Master - inventoryItem

icmasterid  icdescription
WAD110795       WM KIWI-KLIP 3 BEND                    
WAD110796       WM KIWI-KLIP 3 BEND (MZ3,4,&6)                    
WAD118806-50    STROLLER VALENCE BACKDRP HINGE                    
WAD118808       IK STROL B DROP MOUNTING HDW    
WAD118942       1" S-HOOK BAG 100                                 

Detail - inventoryLine

icmasterid  icdetailquantity    pomasterid
WAD110796               -900    NULL
WAD110796                  0    NULL
WAD110796                  0    119450
WAD110796                900    119347
WAD118808                  0    NULL
WAD118808                 34    NULL
WAD118942                  0    NULL
WAD118942                 59    NULL
WAD118942                  0    NULL
WAD118942                -59    NULL
WAD118942                 59    NULL

my sql

SELECT inventoryitem.icmasterid,
       inventoryitem.icdescription,
       inventoryline.icdetailquantity,inventoryline.pomasterid
FROM  inventoryitem 
      LEFT OUTER JOIN inventoryline ON inventoryitem.icmasterid=inventoryline.icmasterid 
WHERE inventoryitem.icmasterid < 'WAD18' and inventoryitem.icmasterid like 'WAD%' 
ORDER BY inventoryitem.icmasterid

Вышеприведенное дает мне все предметы в инвентаризации и соответствующие записи инвентаризации, как и ожидалось.

Но когда я добавляю

and inventoryline.pomasterid <> ''

, я получаювсего два ряда.

icmasterid  ICdescription                      icdetailquantity   pomasterid
WAD110796   WM KIWI-KLIP 3 BEND (MZ3,4,&6)                  0   119450
WAD110796   WM KIWI-KLIP 3 BEND (MZ3,4,&6)                900   119347

Мне нужно

icmasterid     icdescription                      icdetailquantity  pomasterid
WAD110796      WM KIWI-KLIP 3 BEND (MZ3,4,&6)                    0  119450
WAD110796      WM KIWI-KLIP 3 BEND (MZ3,4,&6)                  900  119347
WAD118806-50   STROLLER VALENCE BACKDRP HINGE                  NULL NULL
WAD118808      IK STROL B DROP MOUNTING HDW                    NULL NULL
WAD118942      1" S-HOOK BAG 100                               NULL NULL

Ответы [ 2 ]

2 голосов
/ 27 июня 2019

Переместите логику в предложении WHERE в предложение ON:

SELECT
    ii.icmasterid,
    ii.icdescription,
    ii.icdetailquantity,inventoryline.pomasterid
FROM inventoryitem ii
LEFT JOIN inventoryline il
     ON ii.icmasterid = il.icmasterid AND
        -- SUBSTRING(ii.icmasterid, 4, 2) < '18' AND
        ii.icmasterid LIKE 'WAD%' 
ORDER BY
    ii.icmasterid;
0 голосов
/ 27 июня 2019

Основываясь на ответе Тима Бигелейзена, я придумал это.

SELECT
    ii.icmasterid,
    ii.icdescription,
    ii.icdetailquantity,inventoryline.pomasterid
FROM inventoryitem ii
LEFT JOIN inventoryline il
    ON ii.icmasterid = il.icmasterid AND and inventoryline.pomasterid <> ''
WHERE
    ii.icmasterid < 'WAD18' AND
    ii.icmasterid LIKE 'WAD%' 
ORDER BY
    ii.icmasterid;
...