我遇到了一个问题,我试图返回的列中只有1个值匹配的行。例如:
CREATE TABLE TEST
(
ID INT PRIMARY KEY,
FIRSTNAME VARCHAR(30) NOT NULL,
LASTNAME VARCHAR(30) NOT NULL,
EMAIL VARCHAR(50),
PHONENUMBER VARCHAR(50)
STAMP DATETIME
)
INSERT INTO TEST VALUES (1, 'Tom', 'Lew', 'tom@hotmail.com', '11111111111', '2019-08-23 15:12:06.807')
INSERT INTO TEST VALUES (2, 'Tom', 'Lew', 'tom@hotmail.com', '22222222222', '2019-08-27 15:12:06.807')
INSERT INTO TEST VALUES (3, 'Jack', 'Stan', 'jstan@hotmail.com', '3333333333', '2019-08-03 15:12:06.807')
INSERT INTO TEST VALUES (4, 'John', 'Doe', 'jdoe@hotmail.com', '44444444444', '2019-08-13 15:12:06.807')
INSERT INTO TEST VALUES (5, 'Peter', 'Griffin', 'pgriffin@hotmail.com', '55555555555', '2019-07-23 15:12:06.807')
INSERT INTO TEST VALUES (6, 'Homer', 'Simpson', 'hsimpson@hotmail.com', '66666666666', 2019-08-23 15:12:06.807')
SELECT FirstName, LastName, Email, PhoneNumber
FROM TEST GROUP BY FirstName, LastName, Email, PhoneNumber
HAVING COUNT (FirstName) <= 1
因此,应该假定结果返回除“ Tom”之外的所有内容,因为“ Tom”在“名字”列中具有多个值匹配。但是,它正在返回所有内容。
如果我执行SELECT FirstName,LastName,Email和GROUP BY FirstName,LastName,Email,它会正确返回。
答案 0 :(得分:4)
您可以使用not exists
。如果您只关心名字:
select t.*
from test t
where not exists (select 1
from t t2
where t2.firstname = t.firstname and
t2.id <> t.id
);
答案 1 :(得分:0)
您选择查询的问题是两个汤姆没有相同的电话号码。如果您要在GROUP BY
子句中包含电话号码,它将为您提供两个唯一的两行。您需要确定GROUP BY
的唯一组合列。
如果您只关心名字,您的查询将是这样。
SELECT FirstName, LastName, Email, PhoneNumber
FROM TEST GROUP BY FirstName
HAVING COUNT (FirstName) <= 1
如果您将 LastName 和 Email 放入GROUP BY
中,则:
SELECT FirstName, LastName, Email, PhoneNumber
FROM TEST GROUP BY FirstName, LastName, Email
HAVING COUNT (FirstName) <= 1
答案 2 :(得分:0)
由于您检查唯一的FirstName
,因此您只应GROUP BY FirstName
并使用MAX()
或MIN()
在其他列上进行汇总(这没有任何区别,因为条件HAVING
子句中,请确保这些列中只有1个值存在):
SELECT FirstName,
MAX(LastName) LastName, MAX(Email) Email, MAX(PhoneNumber) PhoneNumber
FROM TEST
GROUP BY FirstName
HAVING COUNT(*) = 1
请参见demo。
结果:
| FirstName | LastName | Email | PhoneNumber |
| --------- | -------- | -------------------- | ----------- |
| Homer | Simpson | hsimpson@hotmail.com | 66666666666 |
| Jack | Stan | jstan@hotmail.com | 3333333333 |
| John | Doe | jdoe@hotmail.com | 44444444444 |
| Peter | Griffin | pgriffin@hotmail.com | 55555555555 |
答案 3 :(得分:0)
我将使用ROW_NUMBER()排除重复的记录:
SELECT * FROM(
SELECT firstname, lastname, email, phonenumber,
ROW_NUMBER() OVER(PARTITION BY firstname ORDER BY firstname) AS rn
FROM test
)
WHERE rn=1;
希望这会有所帮助。