T-SQL完全外部联接(提供示例)

T-SQL完全外部联接(提供示例),sql,azure,azure-sql-database,Sql,Azure,Azure Sql Database,我在T-SQL中使用完全外部联接时遇到一些问题。左侧外部联接部分似乎工作正常,但右侧外部联接未按预期工作。下面是一些用于测试此功能的示例数据: 我有一个包含以下列和数据的表a。标有红色的行是在表B中找不到的行 第二个表B包含以下列和数据。标记为黄色的行是在表A中找不到的行 我正在尝试使用以下sql代码连接表: select tableA.klientnr, tableA.uttakstype, tableA.uttaksnr, tableA.vareanr TableAItem,tableB

我在T-SQL中使用完全外部联接时遇到一些问题。左侧外部联接部分似乎工作正常,但右侧外部联接未按预期工作。下面是一些用于测试此功能的示例数据:

我有一个包含以下列和数据的表a。标有红色的行是在表B中找不到的行

第二个表B包含以下列和数据。标记为黄色的行是在表A中找不到的行

我正在尝试使用以下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中的行

预计将有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

使用
完全联接进行过滤非常棘手。您的
where
标准实际上是将
完全连接
转换为
左连接

您可以通过在
加入之前进行筛选来完成所需的操作

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; 

非常感谢戈登!我必须在我正在进行的更复杂的sql查询中尝试这一点!我一试用就回来反馈!如果有更多的连接,那么我应该在每个子选择中使用这些连接?@Luizaonancea。你的问题显然涉及两个表格。您可以用更复杂的表达式或使用CTE替换这些表达式。如果不清楚如何执行此操作,请提出一个新问题,并对该问题进行更适当的描述。我已对该问题进行了编辑,以包含一个sql查询,其中包含完整的外部联接。这是正确的处理方法吗?