2017-02-27 4 views
0

Meine Abfrage machen eine richtige Join, aber die Ergebnisse sind nicht korrekt.
Null Werte müssen sein, wo Spalte NAME_2 ist gleich A und ich kann nicht herausfinden, was falsch ist. HierSQL Right Beitreten Problem

ist die Abfrage:

http://sqlfiddle.com/#!6/cd45b/1

Für die Zukunft Leser. Die Definition der Tabellen:

CREATE TABLE S1 (TIME_1 DateTIME, INTERVAL_1 INT, NAME_1 varchar(20),INITIAL_VAL int); 
CREATE TABLE S2 (TIME_2 DateTIME, INTERVAL_2 INT, NAME_2 varchar(20), FINAL_VAL int); 

Die Daten Einsätze auf die Frage bezogen werden:

INSERT INTO S1 values('10.02.2017 00:00',1, 'B',13); 
INSERT INTO S1 values('10.02.2017 01:00',2, 'B',14); 
INSERT INTO S1 values('10.02.2017 02:00',3, 'B',10); 
INSERT INTO S1 values('10.02.2017 03:00',4, 'B',15); 

INSERT INTO S1 values('10.02.2017 00:00',1, 'C',42); 
INSERT INTO S1 values('10.02.2017 01:00',2, 'C',10); 
INSERT INTO S1 values('10.02.2017 02:00',3, 'C',22); 
INSERT INTO S1 values('10.02.2017 03:00',4, 'C',18); 


INSERT INTO S2 values('10.02.2017 00:00',1, 'A',12); 
INSERT INTO S2 values('10.02.2017 01:00',2, 'A',13); 
INSERT INTO S2 values('10.02.2017 02:00',3, 'A',9); 
INSERT INTO S2 values('10.02.2017 03:00',4, 'A',16); 

INSERT INTO S2 values('10.02.2017 00:00',1, 'B',16); 
INSERT INTO S2 values('10.02.2017 01:00',2, 'B',22); 
INSERT INTO S2 values('10.02.2017 02:00',3, 'B',20); 
INSERT INTO S2 values('10.02.2017 03:00',4, 'B',10); 

INSERT INTO S2 values('10.02.2017 00:00',1, 'C',42); 
INSERT INTO S2 values('10.02.2017 01:00',2, 'C',15); 
INSERT INTO S2 values('10.02.2017 02:00',3, 'C',22); 
INSERT INTO S2 values('10.02.2017 03:00',4, 'C',19); 

Erste Abfrage von der Frage:

WITH CTE1 
AS 
(
    SELECT ROW_NUMBER() OVER (ORDER BY NAME_1) AS V1, * FROM S1 
) 
,CTE2 
AS 
(
    SELECT ROW_NUMBER() OVER (ORDER BY NAME_2) AS V2,* FROM S2 
) 
SELECT 
CTE2.NAME_2, 
CTE2.TIME_2, 
INTERVAL_2, 
CTE1.INITIAL_VAL, 
CTE2.FINAL_VAL 
FROM CTE1 
RIGHT JOIN CTE2 
ON CTE1.V1=CTE2.V2 
+1

Zeigen Sie uns die Abfrage als formatierten Test auch. Berücksichtigen Sie auch einen Wechsel zum linken Join. Die meisten Leute finden richtig, verbinden sich völlig verwirrend. ('main table left join optionale Daten' anstelle von 'optionale Daten rechts beitreten Haupttabelle'.) – jarlh

+0

Ich denke, Sie sind hier verwirrend. Sie dachten, dass Sie sich mit 'CTE1.name_1 = CTE2.name_2;' verbinden, so dass 'name_2 = 'A'' bei der Verknüpfung mit cte1 einen NULL-Wert hat. Aber hier verwenden Sie 'CTE1.V1 = CTE2.V2;' das ist 'ROW_NUMBER() order by name_x', nicht' name_x' selbst. –

+0

Ihre Geige ist auf SQL Server 2014, während Sie Ihre Frage mit Oracle markiert haben. Welche rdbms verwendest du? –

Antwort

1

Ihr Recht join wird passend über ROW_NUMBER produziert. Es ist also egal, dass es NAME_2 Wert ist: A, hat keine Übereinstimmung mit NAME_1 Wert.

Es ist passend A aus Tabelle S1 mit B aus Tabelle S2, weil sie beide bekommen die gleiche ROW_NUMBER

Bitte diese laufen, um zu sehen, was angepasst ist, wenn Sie mit der rechten trete:

SELECT ROW_NUMBER() OVER (ORDER BY NAME_1) AS V1, * FROM S1; 
SELECT ROW_NUMBER() OVER (ORDER BY NAME_2) AS V2,* FROM S2; 

bearbeiten : Beantworten Ihrer Frage aus dem Kommentar. Es ist sehr schwer zu wissen, was genau brauchen Sie zu bauen, aber ich denke, dass das Intervall könnte einige interessante Ergebnisse bringen:

WITH CTE1 
AS 
(
    SELECT ROW_NUMBER() OVER (ORDER BY NAME_1) AS V1, * FROM S1 
) 
,CTE2 
AS 
(
    SELECT ROW_NUMBER() OVER (ORDER BY NAME_2) AS V2,* FROM S2 
) 
SELECT 
CTE2.NAME_2, 
CTE2.TIME_2, 
INTERVAL_2, 
CTE1.INITIAL_VAL, 
CTE2.FINAL_VAL 
FROM CTE1 
RIGHT JOIN CTE2 
ON CTE1.NAME_1=CTE2.NAME_2 AND CTE1.INTERVAL_1 = CTE2.INTERVAL_2 
+0

Sie haben Recht, aber wie kann ich das beheben? Ich brauche so etwas: 'ON CTE1.NAME_1.NAME_1 = CTE2.NAME_2.NAME_2' – BOB

0

Ist das Intervall immer gleiche gilt für Name_1 und Name_2 ?. Sonst wird es wieder schiefgehen. Nicht sicher, ob Sie einen Join nur in der Spalte Name oder in der Kombination Name & benötigen. Bitte ignorieren Sie, wenn die Antwort von Jakub Szumiato bereits für Sie arbeitet. Ich habe eine einfache Testdaten genommen und mit der Anfrage von Jakub Szumiato ausgeführt. Dies ist die Ausgabe.

enter image description here

+0

'Intervall 'ist vom Stundenintervall, also für' 00: 00' ist das Intervall '1' für' 01: 00' Intervall ist '2' und so weiter ... – BOB