SQL-如果列的值不相同,则仅返回行

时间:2019-10-25 18:09:01

标签: 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, '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,它会正确返回。

4 个答案:

答案 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;

希望这会有所帮助。