【发布时间】:2015-08-18 08:40:36
【问题描述】:
如何进行左连接,每个类别中只有一对一的行。以下是类别 ID 和产品价格。请注意,如果我使用 LEFT JOIN,我不希望出现第 5 类出现重复。
(1) 最合适的连接是当每个表中的类别和价格都匹配时。这是第二类的情况(请注意,表 A 和 B 中的行顺序不同)
(2) 如果只有类别匹配,那么我想显示任何行的字段(就像我在第一个类别中所做的那样,它是多行之一)。
(3) 如果类别和价格都不匹配,我想获得 NULL。
我使用了以下查询,但对我来说太慢了。
with
A as (select A.id, A.price
,ROW_NUMBER() over(partition BY id) as Row_id_A
,ROW_NUMBER() OVER(PARTITION BY id, price order by price asc) AS [Row_id_price_A]
from TableA as A)
,
B as (select B.id, B.price, B.field
,ROW_NUMBER() over(partition BY id) as Row_id_B
,ROW_NUMBER() OVER(PARTITION BY id, price order by price asc) AS [Row_id_price_B]
from TableB as B)
select A.id, A.price, A.Row_A,
,ResultField=case
when A.Row_id_A=C.Row_id_B then C.field
when [Row_id_price_A]=[Row_id_price_B] then D.field
else N'One of many: '+C.field
end
from A
outer apply (select top 1 * from B
where
A.id=B.id
and Row_A=Row_B
) as C
outer apply (select top 1 * from B
where
A.id=B.id
and Row_A=Row_B
and [Row_id_price_A]=[Row_id_price_B]
) as D
更新。我添加示例数据:
CREATE TABLE dbo.TableA(
id INTEGER NOT NULL
,price INTEGER NOT NULL
);
INSERT INTO TableA(id,price) VALUES (1,50);
INSERT INTO TableA(id,price) VALUES (2,20);
INSERT INTO TableA(id,price) VALUES (2,30);
INSERT INTO TableA(id,price) VALUES (2,50);
INSERT INTO TableA(id,price) VALUES (4,15);
INSERT INTO TableA(id,price) VALUES (4,5);
INSERT INTO TableA(id,price) VALUES (5,100);
INSERT INTO TableA(id,price) VALUES (5,100);
CREATE TABLE dbo.TableB(
id INTEGER NOT NULL
,price INTEGER NOT NULL
,field VARCHAR(2) NOT NULL
);
INSERT INTO TableB(id,price,field) VALUES (1,1,'A1');
INSERT INTO TableB(id,price,field) VALUES (2,30,'A2');
INSERT INTO TableB(id,price,field) VALUES (2,50,'A3');
INSERT INTO TableB(id,price,field) VALUES (2,20,'A4');
INSERT INTO TableB(id,price,field) VALUES (5,5,'A5');
INSERT INTO TableB(id,price,field) VALUES (5,100,'A6');
INSERT INTO TableB(id,price,field) VALUES (5,100,'A7');
INSERT INTO TableB(id,price,field) VALUES (6,1,'A8');
【问题讨论】:
-
你使用的是哪个版本的sql server?
-
请以文本形式提供示例数据以供重复使用 - 或者更好地作为插入数据
-
我插入了插入数据:-)
标签: sql sql-server join sql-server-2008-r2