Ms-Access

對於第一個欄位中的給定常量,查找不匹配第二個欄位的行

  • March 18, 2020

考慮一個包含兩個字元串欄位FIRST_NAMELAST_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

等等 - 想要的結果!

psdb<>fiddle是一個比 SQLFiddle 更好的工具 - 例如,更多的伺服器(參見下拉菜單)和更多的功能(參見 參考資料compare link)!

pps 歡迎來到論壇!

引用自:https://dba.stackexchange.com/questions/262197