SQL-仅当列的值不相同时返回行
我遇到了一个问题,我试图返回一列中只有1个值匹配的行。例如:SQL-仅当列的值不相同时返回行,sql,Sql,我遇到了一个问题,我试图返回一列中只有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, 'To
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”在First Name列中有多个值匹配项。然而,它正在归还一切
如果我按名字、名字、电子邮件选择名字、电子邮件和分组,它会正确返回。您可以使用“不存在”。如果你只关心名字:
select t.*
from test t
where not exists (select 1
from t t2
where t2.firstname = t.firstname and
t2.id <> t.id
);
您可以使用“不存在”。如果你只关心名字:
select t.*
from test t
where not exists (select 1
from t t2
where t2.firstname = t.firstname and
t2.id <> t.id
);
select查询的问题是两个Tom没有相同的电话号码。如果要在GROUPBY子句中包含phonenumber,它将为两个TOM提供两个唯一的行。您需要确定分组依据的唯一组合列 如果您只关心FirstName,那么您的查询将是这样的
SELECT FirstName, LastName, Email, PhoneNumber
FROM TEST GROUP BY FirstName
HAVING COUNT (FirstName) <= 1
select查询的问题是两个Tom没有相同的电话号码。如果要在GROUPBY子句中包含phonenumber,它将为两个TOM提供两个唯一的行。您需要确定分组依据的唯一组合列 如果您只关心FirstName,那么您的查询将是这样的
SELECT FirstName, LastName, Email, PhoneNumber
FROM TEST GROUP BY FirstName
HAVING COUNT (FirstName) <= 1
由于您检查的是唯一的名字,因此只应按名字分组,并在其他列上使用MAX或MIN进行聚合,这没有任何区别,因为HAVING子句中的条件确保这些列中只存在1个值:
SELECT FirstName,
MAX(LastName) LastName, MAX(Email) Email, MAX(PhoneNumber) PhoneNumber
FROM TEST
GROUP BY FirstName
HAVING COUNT(*) = 1
看。
结果:
由于您检查的是唯一的名字,因此只应按名字分组,并在其他列上使用MAX或MIN进行聚合,这没有任何区别,因为HAVING子句中的条件确保这些列中只存在1个值:
SELECT FirstName,
MAX(LastName) LastName, MAX(Email) Email, MAX(PhoneNumber) PhoneNumber
FROM TEST
GROUP BY FirstName
HAVING COUNT(*) = 1
看。
结果:
我将使用行号排除重复记录:
SELECT * FROM(
SELECT firstname, lastname, email, phonenumber,
ROW_NUMBER() OVER(PARTITION BY firstname ORDER BY firstname) AS rn
FROM test
)
WHERE rn=1;
希望这有帮助。我将使用行号排除重复记录:
SELECT * FROM(
SELECT firstname, lastname, email, phonenumber,
ROW_NUMBER() OVER(PARTITION BY firstname ORDER BY firstname) AS rn
FROM test
)
WHERE rn=1;
希望这有帮助。什么是数据库和版本?什么是数据库和版本?谢谢,这很完美。谢谢,这很完美。