0

您好,我正在努力获取下面的查询。我想要的是返回具有唯一名称和姓氏的行。我得到的是所有重复的行

这是我的 sql

DECLARE @tmp AS TABLE (Name VARCHAR(100), Surname VARCHAR(100))

INSERT INTO @tmp

SELECT CustomerName,CustomerSurname FROM Customers
WHERE 
NOT EXISTS 
(SELECT Name,Surname 
 FROM @tmp 
 WHERE Name=CustomerName 
 AND ID Surname=CustomerSurname
GROUP BY Name,Surname )

请有人在这里指出我正确的方向。//绝望(我也尝试过不使用 GROUP BY 但得到相同的结果)

4

4 回答 4

3

DISTINCT会成功的。

SELECT DISTINCT CustomerName, CustomerSurname
FROM Customers

演示

如果您只想要真正没有重复的记录(而不是将重复表示为单个记录),您可以使用GROUP BYand HAVING

SELECT CustomerName, CustomerSurname
FROM Customers
GROUP BY CustomerName, CustomerSurname
HAVING COUNT(*) = 1

演示

于 2013-01-04T11:31:58.050 回答
0

当您的@Tmp 表仍然为空时,您是否正在这样做?如果是这样:您的整个“选择”在“插入”语句之前被完全评估,它不会执行“运行查询并添加一行、插入该行、运行查询并获取另一行、插入该行等。 "

如果您只想插入唯一的客户,请在不存在子句中使用相同的“客户”表

SELECT c.CustomerName,c.CustomerSurname FROM Customers c
WHERE 
NOT EXISTS 
(SELECT 1
 FROM Customers c1
 WHERE c.CustomerName = c1.CustomerName 
 AND c.CustomerSurname = c1.CustomerSurname
 AND c.Id <> c1.Id)

如果要插入一组独特的客户,请使用“distinct”

于 2013-01-04T11:40:18.650 回答
0

首先,我认为@David 的答案是你想要的。但是重新阅读您的评论,也许您想要所有姓名和姓氏的组合:

SELECT n.CustomerName, s.CustomerSurname
FROM 
    ( SELECT DISTINCT CustomerName
      FROM Customers
    ) AS n
  CROSS JOIN
    ( SELECT DISTINCT CustomerSurname
      FROM Customers
    ) AS s ;
于 2013-01-04T12:38:03.770 回答
0

通常,如果您正在执行 WHERE NOT EXISTS 或 WHERE EXISTS 或 WHERE NOT IN 子查询,则应使用所谓的“相关子查询”,如上面 ypercube 的答案中所示,其中表别名用于内部和外部表(内表连接到外表)。超立方体举了一个很好的例子。

通常,NOT EXISTS 优于 NOT IN(除非 WHERE NOT IN 是从您无法加入的完全不相关的表中选择的。)

有时,如果您想执行 WHERE EXISTS(从列中没有重复值的小表中选择),您也可以通过在 EXISTS 中所需的列上将主查询与该表连接起来来做同样的事情。并不总是最好或最安全的解决方案,如果该表中有很多行,可能会使查询变慢,并且如果连接表中的该列有 dup 值,则可能导致许多重复行 - 在这种情况下,您必须添加 DISTINCT到主查询,这会导致它对所有列上的数据进行排序。——根本没有效率。

而且,类似地,如果您 LEFT OUTER JOIN 将要进行子查询的表并添加 WHERE ,则可以完成 WHERE NOT IN 或 NOT EXISTS 相关子查询(并给出完全相同的执行计划)。一片空白。你必须小心使用它,但你不需要 DISTINCT。坦率地说,我更喜欢使用 WHERE NOT IN 子查询或 NOT EXISTS 相关子查询,因为语法使意图明确并且很难出错。

并且您不需要在此类子查询(相关或不相关)内的 SELECT 中使用 DISTINCT。这将浪费处理(对于 WHERE EXISTS 或 WHERE IN 子查询,SQL 优化器无论如何都会忽略它,而只使用与外部查询中的每一行匹配的第一个值)。(希望这是有道理的。)

于 2017-05-04T21:49:00.217 回答