繁体   English   中英

SQL右联接问题

[英]SQL Right Join issue

我的查询进行了Right Join,但结果不正确。
Null值必须是NAME_2列与A相等A ,我无法弄清楚哪里出了问题。

这是查询:

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

您的右侧ROW_NUMBER产生的ROW_NUMBER匹配。 因此,它的NAME_2值无关紧要: A ,与NAME_1的值不匹配。

它匹配A从表S1B从表S2 ,因为他们都得到同样的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

名称_1和名称_2的间隔是否始终相同? 否则它将再次出错。 不确定只需要在“名称”列上联接还是“名称和间隔”组合。 如果Jakub Szumiato给出的答案已经为您服务,请忽略。 我已经获取了一个简单的测试数据,并使用Jakub Szumiato给出的Query执行。 这是输出。

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM