2017-02-27 64 views
0

我的查詢進行了正確加入,但結果不正確。
Null值必須在列NAME_2等於A,我無法弄清楚什麼是錯的。SQL Right Join問題

下面是該查詢:

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

對於未來的讀者。表的定義:

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); 

相關問題的數據插入:

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); 

初始查詢從這樣一個問題:

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

向我們展示查詢格式化測試。另外考慮切換到左連接。大多數人發現正確的加入完全混亂。 ('主表左連接可選數據'而不是'可選數據右連接主​​表')。 – jarlh

+0

我認爲你在這裏感到困惑。你認爲你加入了'CTE1.name_1 = CTE2.name_2;'所以'name_2 ='A''在加入cte1時會有NULL值。但是在這裏你使用'CTE1.V1 = CTE2.V2;'這是'ROW_NUMBER()按名稱_x'排序,而不是'name_x'本身。 –

+0

當你用Oracle標記你的問題時,你的小提琴就在sql server 2014上。你使用的是什麼rdbms? –

回答

1

你的右連接是匹配了生產ROW_NUMBER。因此,NAME_2值:A與NAME_1值沒有匹配。

從表S1B從表S2匹配A,因爲他們都得到同樣的ROW_NUMBER

請運行該看的時候你做正確的加入什麼是匹配:

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

編輯: 回答你的問題從評論。這是很難確切地知道你需要建立什麼,但我認爲,時間間隔可能會帶來一些有趣的結果:

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

你說得對,但我該如何解決這個問題?我需要這樣的東西:'在CTE1.NAME_1.NAME_1 = CTE2.NAME_2。NAME_2' – BOB

0

是區間始終同爲NAME_1和NAME_2?否則它會再次出錯。不知道您是否只需要名稱列或名稱組合&區間的連接。如果Jakub Szumiato給出的答案已經適用於您,請忽略。我採用了一個簡單的測試數據,並用Jakub Szumiato給出的查詢執行。這是輸出。

enter image description here

+0

'Interval'從小時間隔開始,因此對於'00:00'而言,'01:00'的間隔爲'1',間隔爲'2',依此類推...... – BOB