Wie gehts (links / rechts) zwei Tabellen?

Ich habe versucht, die Produkt-ID mit der fehlenden notwendigen Version herauszufinden. Die folgende Abfrage zeigt das Beispiel:

DECLARE @ProductWithVersion TABLE(ProductId int, VersionId int) insert into @ProductWithVersion values(1281,7),(2220,8) DECLARE @NecessaryVersion TABLE(VersionId int) insert into @NecessaryVersion values(7),(8),(9) 

Ich möchte das Mapping-Ergebnis wie:

 ProductId VerisonId VersionId 1281 7 7 1281 null 8 1281 null 9 2220 null 7 2220 8 8 2220 null 9 

Das bedeutet, dass die VersionId von @NecessaryVersion alle von ihnen zeigen sollte (7,8,9), und die VersionId von @ProductWithVersion zeigt null an, wenn es keine Mapping VersionId mit @NecessaryVersion gibt.

Ich kann es nicht herausfinden, da es komplizierter ist als links oder rechts …

Du brauchst eine Vermittlerkreuzvereinigung von ProductId wie so:

 select p.ProductId, pv.VersionId, n.VersionId from @NecessaryVersion n cross join (select distinct ProductId from @ProductWithVersion i) as p left join @ProductWithVersion pv on p.ProductId = pv.ProductId and n.VersionId = pv.VersionId 

rextester demo: http://rextester.com/VNITDI69180

kehrt zurück:

 +-----------+-----------+-----------+ | ProductId | VersionId | VersionId | +-----------+-----------+-----------+ | 1281 | 7 | 7 | | 1281 | NULL | 8 | | 1281 | NULL | 9 | +-----------+-----------+-----------+ 

Wenn du eine Tabelle hast, wo ProductId einzigartig ist, kannst du das anstelle der Auswahl der distinct ProductId aus einer Quelle verwenden.


Für die aktualisierten Beispieldaten, Reester-Demo: http://rextester.com/LVMFO44017

Die gleiche Abfrage (mit einer order by ) gibt zurück:

kehrt zurück:

 +-----------+-----------+-----------+ | ProductId | VersionId | VersionId | +-----------+-----------+-----------+ | 1281 | 7 | 7 | | 1281 | NULL | 8 | | 1281 | NULL | 9 | | 2220 | NULL | 7 | | 2220 | 8 | 8 | | 2220 | NULL | 9 | +-----------+-----------+-----------+