對於第一個欄位中的給定常量,查找不匹配第二個欄位的行
考慮一個包含兩個字元串欄位
FIRST_NAME
和LAST_NAME
.對於給定的
Lastname == Smith
,我發現期望有另一個給定Lastname == Johnson
且相同的 Firstname 的行。如何查找不屬於這種情況(即
Lastname == Smith, Firstname == Julia
存在但Lastname == Johnson, Firstname == Julia
不存在)的行?樣本數據:
FIRST_NAME, LAST_NAME Jane, Smith John, Smith Blake, Smith Jane, Johnson Blake, Johnson
查詢至今:
SELECT FIRST_NAME FROM (SELECT DISTINCT LAST_NAME, COUNT(*) AS c, FIRST_NAME FROM Table1 GROUP BY FIRST_NAME) WHERE c = 1
我想得到什麼:
John, Smith
我相信您想要以下內容(請參閱此處的小提琴):
創建和填充表 - 使用 SQL Server 2012,因為這將最接近地模擬 Access。我使用了我自己的 SQL 風格,很大程度上以此為藍本。
CREATE TABLE source_table ( first_name VARCHAR (5) NOT NULL, last_name VARCHAR (7) NOT NULL, CONSTRAINT f_l_uq UNIQUE (first_name, last_name) );
和
INSERT INTO source_table (first_name, last_name) VALUES ('Jane', 'Smith'), ('John', 'Smith'), ('Blake', 'Smith'), ('Jane', 'Johnson'), ('Blake', 'Johnson');
我
UNIQUE
對 (first_name, last_name) 的組合進行了限制,因為它是有道理的 - 如果這確實是你的整個表,你可以使它成為PRIMARY KEY
- 如果有 (a)PK
欄位作為 a 的一部分具有更多欄位的表,然後只需添加此約束。如果您確實有重複的名字和姓氏組合(重複),那麼您只需
DISTINCT
向您添加一個子句SELECT
,這將為您提供所需結果的唯一值 - 包含在小提琴中,此處未顯示。然後執行以下 SQL:
SELECT -- DISTINCT if there are dupes! s1.first_name, s1.last_name FROM source_table s1 WHERE s1.last_name = 'Smith' AND s1.first_name NOT IN ( SELECT first_name FROM source_table s2 WHERE last_name != 'Smith' );
結果:
first_name last_name John Smith
等等 - 想要的結果!
ps
db<>fiddle
是一個比 SQLFiddle 更好的工具 - 例如,更多的伺服器(參見下拉菜單)和更多的功能(參見 參考資料compare link
)!pps 歡迎來到論壇!