2017-05-16 2 views
1

ich zwei Abfragen zu kombinieren haben:SQL kommen auf CTE mit mehreren

Abfrage 1 - eine einfache innere Verknüpfung wo Abfrage:

Select t1.c1, t1.c2, t1.c3, t2.c1 

from s1.t2 t2 
inner join s1.t1 t1 on t2.c6 = t1.c6 

where t2.c5 >= '2014-01-01' 
and t2.c5 >= '2014-01-01' 
and t1.c4 = 'P' 

Diese eine Tabelle mit 4 Spalten natürlich zurück. Lassen Sie mich es hier ziehen:

+----+----+----+-------+ 
| C1 | C2 | C3 | T2.C1 | 
+----+----+----+-------+ 
| | | |  | 

Abfrage 2 - mit, dann „durch partition“ Anweisung mit einem Duplikate entfernen:

WITH all_col1 (ONE, TWO) AS 
(
    SELECT col1, col2 
    FROM Schema1.Table1 
    UNION 
    SELECT col1, col2 
    FROM Schema2.Table2 
    UNION 
    SELECT col1, col2 
    FROM Schema2.Table3 
) 
SELECT * 
FROM (
    SELECT ONE, TWO, 
    ROW_NUMBER() OVER(PARTITION BY ONE ORDER BY ONE) duplicate_count 
    FROM all_col1 
) all_col1_w_duplicat_count 
WHERE duplicate_count = 1 

Dies gibt zwei Spalten, mit den alle Duplikate entfernt, (was bedeutet, wenn Spalte 1 Duplikate die zusätzlichen Zeilen enthält explizit) entfernt:

+-----+-----+ 
| ONE | TWO | 
+-----+-----+ 
|  |  | 

Also, was ich möchte ist die erste Abfrage und die zweite Abfrage wie folgt kombiniert, um zu sehen, wo zwei der Tabelle hinzugefügt wird, wo ONE stimmt mit C1 überein:

+------+----+----+-------+-----+ 
| C1 | C2 | C3 | T2.C1 | TWO | 
|(ONE) | | |  |  | 
+------+----+----+-------+-----+ 
|  | | |  |  | 

Also, ich habe versucht INTERSECT, Platzhalter Zeilen hinzufügen. das kehrte leer zurück.

Ich habe versucht, Abfrage 1 ein CTE als auch dann Beitritt der beiden - bekam eine Vielzahl von Fehlern versuchen, dass.

Hier ist das Beste, was ich in der Lage gewesen, mit so weit zu kommen - Abfrage 1 in mit Abfrage 2 in seiner select-Anweisung verbindet:

--ALL COL1 WITH beginning 

WITH all_col1 (ONE, TWO) AS 
(
    SELECT col1, col2 
    FROM Schema1.Table1 
    UNION 
    SELECT col1, col2 
    FROM Schema2.Table2 
    UNION 
    SELECT col1, col2 
    FROM Schema2.Table3 
) 


--ALL COL1 SELECT duplicate_count 

SELECT * 
FROM (
    SELECT ONE, TWO, 
    ROW_NUMBER() OVER(PARTITION BY ONE ORDER BY ONE) duplicate_count 
    FROM all_col1 


    -- added join opperation 

    join (


     --SELECT from query 1 

     Select t1.c1, t1.c2, t1.c3, t2.c1 

     from s1.t2 t2 
     inner join s1.t1 t1 on t2.c6 = t5.c6 

     where t2.c5 >= '2014-01-01' 
     and t2.c5 >= '2014-01-01' 
     and t1.c4 = 'P' 


    -- finish join opperation 

    ) as query1 
    on all_col1.ONE = query1.c1 -- <----MOST IMPORTANT PART 


-- finsih ALL COL1 

) all_col1_w_duplicat_count 
WHERE duplicate_count = 1 

Dies ist leider nicht geben Sie mir die Ergebnisse zu den verbundenen die erste Spalte jeder Abfrage, wie es versuchte mit on all_col1.ONE = t1.c1

zu fragen, stattdessen scheint es wie es mir nur die WITH all_col1 gibt.

Ich weiß fast nichts über SQL, Was muss ich lernen, um diese beiden Abfragen zusammen richtig zu verbinden?

+0

Können Sie bitte Beispieldaten zeigen, und die gewünschten Ergebnisse? Ich kann nicht folgen, was Sie nur mit den Abfragen versuchen möchten ... – Siyual

+0

Ihre zweite Abfrage ist viel zu kompliziert. Die "UNION" entfernt Duplikate. –

+0

@Siyual Entschuldigung, ich hätte diese Grafiken zum ersten Mal hinzufügen sollen. Ich habe sie jetzt hinzugefügt. –

Antwort

1

Betrachten von zwei abgeleitete Tabellen (Subqueries in FROM und JOIN Klauseln) als doppelte Zählung Verbindung enthält beide Tabellen und nicht nur eins:

... 
SELECT q.c1, q.c2, q.c3, q.t2_c1, a.[TWO] 
FROM 
    (
    SELECT * 
    FROM (
      SELECT ONE, TWO, 
      ROW_NUMBER() OVER(PARTITION BY ONE ORDER BY ONE) duplicate_count 
      FROM all_col1 
     ) sub 
    WHERE sub.duplicate_count = 1 
) a 

INNER JOIN 
    (
    SELECT t1.c1, t1.c2, t1.c3, t2.c1 as t2_c1 
    FROM s1.t2 t2 
    INNER JOIN s1.t1 t1 on t2.c6 = t5.c6 
    WHERE t2.c5 >= '2014-01-01' 
    AND t2.c5 >= '2014-01-01' 
    AND t1.c4 = 'P' 
) q 

ON a.ONE = q.c1