我在 SQL 中有一個表,如下所示:
CREATE TABLE Color (
id int,
name varchar(50)
);
INSERT INTO
Color
VALUES
(1, 'Blue'),
(2, 'Red'),
(3, 'Black'),
(4, 'Black'),
(5, 'White'),
(6, 'White');
我需要一個查詢來僅顯示顏色在任何其他行中不重復的行。
預期結果表:
| ID | 顏色 |
|---|---|
| 1 | 藍色 |
| 2 | 紅色的 |
我嘗試選擇所需的結果表:
Select c3.id, c2.name
FROM (
SELECT name, count(*)
FROM color c1
GROUP BY name
HAVING count(*) = 1
) c2 INNER JOIN color c3 on c3.name = c2.name
uj5u.com熱心網友回復:
您可以使用 not exists
select id, name
from Color C1
where not exists (select 1 from Color C2 where C2.name = C1.name and C2.id <> C1.id);
uj5u.com熱心網友回復:
你可以使用視窗函式
SELECT
id,
name
FROM (
SELECT *,
count = COUNT(*) OVER (PARTITION BY name)
FROM Color c
)
WHERE count = 1;
或者,可能性能更高:
SELECT
id,
name
FROM (
SELECT *,
nextId = LEAD(id) OVER (PARTITION BY name ORDER BY id),
prevId = LAG(id) OVER (PARTITION BY name ORDER BY id)
FROM Color c
)
WHERE nextId IS NULL AND prevId IS NULL;
uj5u.com熱心網友回復:
SELECT MAX(id) as id, name
FROM color
GROUP BY name
HAVING count(id)=1
@TomuRain 在子查詢的正確軌道上使用“具有”將結果限制為僅計數為 1 的那些記錄。事實上,問題中發布的查詢有效。我相信被問到的問題是是否有更簡潔的方法(我猜測不使用子查詢)來獲得相同的結果。如果您考慮一下,您真正??想在查詢中提出的問題是“哪些顏色只有一個相關聯的 ID?” 這就是為什么“有 count(id)=1”是有道理的,也是為什么你會按名稱分組的原因。但是sql語言的規則要求,當你使用“group by”時,查詢的每一列都要包含在group by中,或者是一個聚合。在 group by 中包含 id 不會得到您正在尋找的結果。然而,由于我們將結果限制為具有單個 ID 的顏色,因此可以使用多個聚合,因為聚合單個記錄將回傳該記錄的值,包括 MAX、MIN 甚至 SUM。我選擇使用MAX。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/313301.html
標籤:sql sql-server 查询语句
