Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-仅当列的值不相同时返回行_Sql - Fatal编程技术网

SQL-仅当列的值不相同时返回行

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

我遇到了一个问题,我试图返回一列中只有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”在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;

希望这有帮助。

什么是数据库和版本?什么是数据库和版本?谢谢,这很完美。谢谢,这很完美。