2016-07-04 5 views
0

Ich habe zwei Tabellen mit gleichen Spalten, ich muss eine Auswahl in diesen zwei Tabellen machen, möchte ich wissen, wie ist der beste Weg, dies zu machen, ist meine Auswahl Test:Führen Sie eine Auswahl aus zwei Tabellen mit den gleichen Spalten

SELECT  
    ISNULL(LoteDet.IdLoteDet, LoteDetPg.IdLoteDet) AS Expr1, 
    ISNULL(LoteDet.IDSac, LoteDetPg.IDSac) AS Expr2, 
    ISNULL(LoteDet.Comprom, LoteDetPg.Comprom) AS Expr3, 
    ISNULL(LoteDet.NossoNum, LoteDetPg.NossoNum) AS Expr4, 
    ISNULL(LoteDet.NossoNumDig, LoteDetPg.NossoNumDig) AS Expr5 
FROM 
    LoteDet 
CROSS JOIN 
    LoteDetPg 
WHERE 
    Expr1 = 500 

Es ist möglich, dies zu machen?

Wie ist der bessere Weg, um diese Art von Auswahl auszuführen, wenn nicht den Wert in einer Tabelle gefunden, wird der Wert in der anderen Tabelle sein ....

------ EDIT

Vielleicht erstellen Sie eine Ansicht ist eine gute Alternative zu dieser Art von Auswahl?

+2

Sind Sie sicher, dass Sie ein kartesisches Produkt benötigen? –

+1

Können Sie das erwartete Ergebnis anzeigen? –

Antwort

0

Verwendung COALESCE:

SELECT  
    COALESCE(LoteDet.IdLoteDet, LoteDetPg.IdLoteDet) AS Expr1, 
    COALESCE(LoteDet.IDSac, LoteDetPg.IDSac) AS Expr2, 
    COALESCE(LoteDet.Comprom, LoteDetPg.Comprom) AS Expr3, 
    COALESCE(LoteDet.NossoNum, LoteDetPg.NossoNum) AS Expr4, 
    COALESCE(LoteDet.NossoNumDig, LoteDetPg.NossoNumDig) AS Expr5 
FROM 
    LoteDet 
CROSS JOIN 
    LoteDetPg 
WHERE 
    Expr1 = 500 

Werfen Sie einen Blick auf diese Dokumentation: https://msdn.microsoft.com/pt-br/library/ms190349.aspx

0

Ich glaube, das Sie zurückkommen wird, was ein Kartesisches Produkt genannt wird. Es ist das Ergebnis einer offenen Verbindung, wie Sie oben haben. Diese Abfrage wird TONS von Datensätzen zurückgeben, da Sie nicht angeben, wie Sie die beiden Tabellen verknüpfen sollen. Es wird nur blind versuchen, übereinstimmende Spalten zu finden. Fügen Sie dem JOIN mindestens eine ON-Bedingung hinzu, damit Sie IDs/Schlüssel zuordnen können. Ich denke, was Sie wollen, ist ein INNERER JOIN mit einem ON; Dies gibt Ihnen alle übereinstimmenden Zeilen basierend auf ID/Key zurück. Jetzt

SELECT 
    CASE WHEN tbl1.Comprom IS NULL THEN tbl2.Comprom ELSE tbl1.Comprom END AS Expr1 
    CASE WHEN tbl1.Nossonum IS NULL THEN tbl2.Nossonum ELSE tbl1.Nossonum END AS Expr2 
FROM 
    tbl1 --LoteDet 
    INNER JOIN tbl2 --LoteDetPg 
     ON (tbl1.ID = tbl2.ID) 
WHERE 
    Expr1 = 500 --I know I swapped the expression values, use whichever expression you need here 

, nur Zeilen, die eine passende ID haben, werden Sie Werte zurück, und es wird den Wert von tbl1 zu verwenden, es sei denn, es null ist, dann wird der Wert von tbl2 zu verwenden.

Bearbeiten: Ich weiß CROSS JOIN wird zu einem INNEREN JOIN, wenn ein WHERE angegeben ist, aber muss die WHERE beide Tabellen enthalten? Ich denke, dass der Expr1 = 500 immer noch ein kartesisches Produkt produziert; Kann mich jemand korrigieren?

Verwandte Themen