Sql 如何仅选择不同的字段

Sql 如何仅选择不同的字段,sql,sql-server,Sql,Sql Server,假设我有一个客户地址表: CName | AddressLine ------------------------------- John Smith | 123 Nowheresville Jane Doe | 456 Evergreen Terrace John Smith | 999 Somewhereelse Joe Bloggs | 1 Second Ave 我想选择具有不同地址行的CName意味着我不想选择John

假设我有一个客户地址表:

CName           |   AddressLine
-------------------------------
John Smith      | 123 Nowheresville
Jane Doe        | 456 Evergreen Terrace
John Smith      | 999 Somewhereelse
Joe Bloggs      | 1 Second Ave
我想选择具有不同地址行的CName意味着我不想选择John Smith,因为它有两个地址。如何做到这一点?

使用:

SELECT CName
FROM Addresses
GROUP BY CName
HAVING COUNT(DISTINCT AddressLine) = 1
使用:


您可以通过执行以下操作获得不同的行:

select cname, min(AddressLine) as AddressLine
from t
group by cname
having count(*) = 1;

您可以通过执行以下操作获得不同的行:

select cname, min(AddressLine) as AddressLine
from t
group by cname
having count(*) = 1;

或者,您可以在不存在的地方使用:

编辑以解决性能问题:

Create Table Test (CName Varchar (20), AddressLine Varchar (50));

Insert Test Values 
('John Smith', '123 Nowheresville'),
('Jane Doe', '456 Evergreen Terrace'),
('John Smith', '999 Somewhereelse'),
('Joe Bloggs', '1 Second Ave')


select cname, min(AddressLine) as AddressLine
from test
group by cname
having count(*) = 1;

Select  CName, AddressLine
From    Test   A
Where Not Exists
(
    Select  *
    From    Test   B
    Where   A.CName = B.CName
    And     A.AddressLine <> B.AddressLine
);
执行计划:


或者,您可以在不存在的地方使用:

编辑以解决性能问题:

Create Table Test (CName Varchar (20), AddressLine Varchar (50));

Insert Test Values 
('John Smith', '123 Nowheresville'),
('Jane Doe', '456 Evergreen Terrace'),
('John Smith', '999 Somewhereelse'),
('Joe Bloggs', '1 Second Ave')


select cname, min(AddressLine) as AddressLine
from test
group by cname
having count(*) = 1;

Select  CName, AddressLine
From    Test   A
Where Not Exists
(
    Select  *
    From    Test   B
    Where   A.CName = B.CName
    And     A.AddressLine <> B.AddressLine
);
执行计划:

试试这个:

SELECT a.CName
FROM Addresses a
GROUP BY a.CName
HAVING COUNT(a.AddressLine) = 1
试试这个:

SELECT a.CName
FROM Addresses a
GROUP BY a.CName
HAVING COUNT(a.AddressLine) = 1

你是说独特而不是独特?意思是你想要所有的CNAME只有一个地址行?你的意思是唯一的而不是独特的?这意味着您希望所有的CNAME都只有一条地址行?这种方法的权衡是它需要一个地址行。但是,这是可行的。@destination data虽然它确实使用相关子查询来确定记录的存在,但生成的执行计划实际上比组更有效,因为它有其他选择。看编辑,很好!很难对执行计划提出异议。加上那句话我很难过,这不是批评。我只是想向OP和其他来这里寻求帮助的人强调这个概念。这种方法的权衡是它需要一个。但是,这是可行的。@destination data虽然它确实使用相关子查询来确定记录的存在,但生成的执行计划实际上比组更有效,因为它有其他选择。看编辑,很好!很难对执行计划提出异议。加上那句话我很难过,这不是批评。我只是想向OP和其他来这里寻求帮助的人强调这个概念。