【发布时间】:2022-06-14 20:37:11
【问题描述】:
考虑以下表格和数据:
CREATE TABLE Foo
(
FooID int NOT NULL PRIMARY KEY,
FooValue char(1) NOT NULL
);
CREATE TABLE Bar
(
FooID int NOT NULL,
BarID int NOT NULL,
BarValue char(1),
CONSTRAINT BarPK PRIMARY KEY (FooID, BarID),
CONSTRAINT FooBar FOREIGN KEY (FooID) REFERENCES Foo(FooID)
);
INSERT INTO Foo(FooID, FooValue) VALUES
(100, 'A'),
(101, 'A'),
(102, 'B'),
(103, 'C'),
(104, 'C');
INSERT INTO Bar(FooID, BarID, BarValue) VALUES
(100, 1, 'X'),
(100, 2, 'Y'),
(101, 1, 'X'),
(101, 2, 'Y'),
(101, 3, 'Z'),
(102, 1, 'X'),
(103, 1, 'Z'),
(104, 1, 'Z');
从这些数据中,我希望 FooValue 和 BarValue 的每个不同组合及其键都有一行。我并不关心返回了哪些键,因此可能的结果集可能如下所示:
| FooID | BarID | FooValue | BarValue |
|---|---|---|---|
| 100 | 1 | A | X |
| 100 | 2 | A | Y |
| 101 | 3 | A | Z |
| 102 | 1 | B | X |
| 104 | 1 | C | Z |
通常我会这样做:
WITH NumberedRows AS
(
SELECT ROW_NUMBER() OVER
(PARTITION BY F.FooValue, B.BarValue ORDER BY F.FooID DESC) AS nr,
F.FooID, B.BarID, F.FooValue, B.BarValue
FROM Foo F
INNER JOIN Bar B
ON B.FooID = F.FooID
)
SELECT FooID, BarID, FooValue, BarValue
FROM NumberedRows
WHERE nr = 1;
不幸的是,我不能使用上述解决方案,因为我被限制不使用 CTE 或 ROW_NUMBER()(或任何其他窗口函数,所以 this similar question 没有帮助)。有没有其他方法可以得到想要的结果?
【问题讨论】:
-
“我坚持不使用 CTE 或 ROW_NUMBER()” 为什么这个非常武断的要求?
标签: sql-server tsql