考慮以下表格和資料:
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 | 條碼 | FooValue | 條形值 |
|---|---|---|---|
| 100 | 1 | 一個 | X |
| 100 | 2 | 一個 | 是 |
| 101 | 3 | 一個 | Z |
| 102 | 1 | 乙 | 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()(或任何其他視窗函式,所以這個類似的問題沒有幫助)。還有另一種方法可以得到想要的結果嗎?
uj5u.com熱心網友回復:
如果你不能使用視窗函式,那么你首先需要找到最大值Foo.FooID(根據視窗函式子句的要求ORDER BY F.FooID DESC ... WHERE rn = 1)
SELECT MAX(F.FooID) AS FooID,
B.BarID,
F.FooValue
FROM Foo F
INNER JOIN Bar B
ON B.FooID = F.FooID
GROUP BY B.BarID,
F.FooValue
獲得這些值后,您可以使用兩個表重新連接:
SELECT F.FooID,
B.BarID,
F.FooValue,
B.BarValue
FROM Foo F
INNER JOIN Bar B
ON B.FooID = F.FooID
INNER JOIN (SELECT MAX(F.FooID) AS FooID,
B.BarID,
F.FooValue
FROM Foo F
INNER JOIN Bar B
ON B.FooID = F.FooID
GROUP BY B.BarID,
F.FooValue ) cte
ON F.FooID = cte.FooID
AND B.BarID = cte.BarID
AND F.FooValue = cte.FooValue
在此處查看演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/492719.html
上一篇:帶有SELECTINTO的標識函式-需要更改種子以動態獲取最后一個現有值
下一篇:我需要將日歷應用程式的行轉換為列
