Полное внешнее соединение T-SQL (образец предоставлен) - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть некоторые проблемы с получением полного внешнего объединения для работы в T-SQL.Кажется, что левая часть внешнего соединения работает нормально, но правое внешнее соединение работает не так, как ожидалось.Вот некоторые примеры данных для проверки:

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

Table A

И вторая таблица B со следующими столбцами и данными.Строки, отмеченные желтым цветом, - это строки, которые нельзя найти в таблице A.

Table B

Я пытаюсь объединить таблицы, используя следующий код sql:

select tableA.klientnr, tableA.uttakstype, tableA.uttaksnr, tableA.vareanr TableAItem,tableB.vareanr tableBitem, tableA.kvantum tableAquantity, tableB.totkvant tableBquantity 
from tableA as tableA
full outer join tableB as tableB on tableA.klientnr=tableB.klientnr and tableA.uttakstype=tableB.uttakstype and tableA.uttaksnr=tableB.uttaksnr and tableA.vareanr=tableB.vareanr and tableB.IsDeleted=0
where tableA.UttaksNr=639779 and tableA.IsDeleted=0

Результатом sql является следующее изображение.Строка, помеченная красным, является дополнительной строкой из таблицы A, которая действительно отображается, но я не могу получить строки из таблицы B, которые будут отображаться Result

Ожидается, что в ней будет 2 дополнительные строки

550   SA   639779  NULL  100059  NULL  0
550   SA   639779  NULL  103040  NULL  14

Позднее редактирование: будет ли это правильным способом обрабатывать полное внешнее объединение там, где есть структура типа заголовок / строка?Или можно оптимизировать запрос?

SELECT ISNULL(q1.accountid, q2.accountid) AccountId
       ,ISNULL(q1.klientnr, q2.klientnr) KlientNr
       ,ISNULL(q1.tilgangstype, q2.tilgangstype) 'Reception Type'
       ,ISNULL(q1.tilgangsnr, q2.tilgangsnr) 'Reception No'
       ,ISNULL(q1.dato, q2.dato) dato
       ,ISNULL(q1.LevNr, q2.LevNr) LevNr
       ,ISNULL(q1.Pakkemerke, q2.Pakkemerke) Pakkemerke
       ,ISNULL(q1.VareANr, q2.VareANr) VareANr
       ,ISNULL(q1.Ankomstdato,q2.Ankomstdato) 'Arrival Date'
       ,q1.Antall1
       ,q1.totkvant1
       ,q1.Antall2
       ,q1.totkvant2
       ,q2.Antall
       ,q2.totkvant
       ,q2.AntallTilFrys
       ,q2.TotKvantTilFrys
       ,ISNULL(q1.EksternKommentar1,q2.EksternKommentar1) EksternKommentar1
       ,q2.[Last Upsert]
FROM (
       SELECT w700.accountid
              ,w700.klientnr
              ,w700.tilgangstype
              ,w700.tilgangsnr
              ,w700.dato
              ,w700.Ankomstdato
              ,w700.LevNr
              ,w700.pakkemerke
              ,w789.VareANr
              ,sum(IIF(w789.prognosetype = 1, w789.Antall, NULL)) AS Antall1
              ,sum(IIF(w789.prognosetype = 1, w789.totkvant, NULL)) AS totkvant1
              ,sum(IIF(w789.prognosetype = 2, w789.Antall, NULL)) AS Antall2
              ,sum(IIF(w789.prognosetype = 2, w789.totkvant, NULL)) AS totkvant2
              ,w700.EksternKommentar1
       FROM trading.W789Prognosekjopstat AS w789
       INNER JOIN trading.W700Tilgangshode AS w700 ON w700.AccountId = w789.AccountId
              AND w700.KlientNr = w789.Klientnr
              AND w700.Tilgangsnr = w789.Tilgangsnr
              AND w700.Tilgangstype = w789.Tilgangstype
              AND w700.IsDeleted = 0
       WHERE w789.IsDeleted = 0
       GROUP BY w700.accountid
              ,w700.klientnr
              ,w700.tilgangstype
              ,w700.tilgangsnr
              ,w700.dato
              ,w700.Ankomstdato
              ,w700.LevNr
              ,w700.pakkemerke
              ,w789.VareANr
              ,w700.EksternKommentar1
       ) q1
FULL OUTER JOIN (
       SELECT w700.accountid
              ,w700.klientnr
              ,w700.tilgangstype
              ,w700.tilgangsnr
              ,w700.dato
              ,w700.Ankomstdato
              ,w700.LevNr
              ,w700.pakkemerke
              ,w702.VareANr
              ,w702.Antall
              ,w702.TotKvant
              ,w702.ValPris
              ,w702.AntallTilFrys
              ,w702.TotKvantTilFrys
              ,w700.EksternKommentar1
              ,(SELECT MAX(LastUpdateDate) FROM (VALUES (w702.createdAt),(w702.updatedAt)) AS UpdateDate(LastUpdateDate)) AS 'Last Upsert' 
       FROM trading.w702PrognoseKjop w702
       INNER JOIN trading.W700Tilgangshode AS w700 ON w700.AccountId = w702.AccountId
              AND w700.KlientNr = w702.Klientnr
              AND w700.Tilgangsnr = w702.Tilgangsnr
              AND w700.Tilgangstype = w702.Tilgangstype
              AND w700.IsDeleted = 0
       WHERE w702.IsDeleted = 0
       ) q2 ON q1.accountid = q2.accountid
       AND q1.klientnr = q2.klientnr
       AND q1.tilgangstype = q2.tilgangstype
       AND q1.tilgangsnr = q2.tilgangsnr
       AND q1.vareanr = q2.vareanr
WHERE totkvant1 IS NOT NULL
       OR totkvant2 IS NOT NULL
       OR totkvant IS NOT NULL

1 Ответ

0 голосов
/ 24 сентября 2019

Фильтрация с full join действительно сложно.Ваши where критерии фактически превращают full join в left join.

. Вы можете делать то, что хотите, отфильтровав до join:

select a.klientnr, a.uttakstype, a.uttaksnr, a.vareanr a.tableAitem,
       b.vareanr b.tableBitem, a.kvantum a.tableAquantity, b.totkvant b.tableBquantity 
from (select a.*
      from tableA a
      where a.UttaksNr = 639779 and a.IsDeleted = 0
     ) a full join
     (select b.*
      from tableB b
      where b.IsDeleted = 0
     ) b
     on a.klientnr = b.klientnr and
        a.uttakstype= b.uttakstype and 
        a.uttaksnr = b.uttaksnr and
        a.vareanr = b.vareanr; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...