2017-02-27 66 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