如何在不使用 SQL 中的 DISTINCT 的情况下删除重复值?

How to remove duplicate values without using DISTINCT in SQL?

我有一个临时 table 一列:

OfficeID
-----
0
1
1
1
60
60
61
61
61
61
317
317  <----
63   <----
63
63
63
63

当我使用 Distinct 删除重复值时,SQL 对结果进行排序,如下所示,但我不想对其进行排序。

OfficeID
--------
    0
    1
    60
    61
    63      <---
    317     <---

我想要这个没有重复值且没有排序的结果

OfficeID
----------
    0
    1
    60
    61
    317    <---
    63     <---

您使用了 GROUP BY 删除重复值而不使用 distinct 函数。

分组依据 最佳。

试试这个查询。

SELECT columnname FROM temptable GROUP BY columnname

您可以简单地将其放在查询的末尾:

ORDER BY Rnd([PrimaryKey]);

这里,PrimaryKey 是 table 的主键。这将使您的结果显示为未排序。

如果您无法更改实际的 table 结构,我只能想到一种方法来实现这一点,那就是使用临时 Table 或 Table 变量。在我下面的测试设置中,我选择了后者。

首先你需要一个 IDENTITY 列来 'store' 事物的顺序:

DECLARE @TempTable TABLE
(
  TempID       INT IDENTITY(1, 1)
, OfficeID INT
);

然后按原样使用事物的顺序填充它(没有 ORDER BY):

INSERT INTO @TempTable (OfficeID)
SELECT OfficeID
FROM OfficeIDs;

现在,如果我们有,我们可以使用 ROW_NUMBER() 带来一些魔力,在这种情况下,它仅用于选择每个 OfficeID 系列的第一项:

SELECT
         OfficeID
FROM     (SELECT
               *
             , ROW_NUMBER() OVER (PARTITION BY OfficeID ORDER BY TempID) SortOrder
          FROM @TempTable) AS t
WHERE t.SortOrder = 1
ORDER BY TempID;

请注意,我需要 ORDER BY @TempTable.TempID 以保持原始排序。

我的测试结果:

OfficeID
-----------
0
1
60
61
317
63

(6 rows affected)


Completion time: 2020-01-01T13:44:14.9947886+01:00

SQL tables代表无序集合。没有顺序,除非列指定顺序。

如果您的临时 table 只有一列,则无法保证原始顺序。 . .因为它没有定义。

可以做的是用两列定义您的临时table。如果您明确定义 table:

create table #temptable (
    id int identity(1, 1) primary key,
    OfficeId int
);

然后像往常一样插入:

insert into #temptable (OfficeId)
    . . . ;

或者,如果您使用 into 创建 table,则:

select identity(1, 1) as id, . . . 
into #temptable
. . .

在这两种情况下,标识列都会捕获插入顺序。

那么你想做的就很简单了:

select officeId
from #temptable
group by officeId
order by min(id);

我找到解决方案:

我必须为临时文件使用 IDENTITY 列 table

SELECT  OfficeID,IDENTITY(int) AS idcol
INTO #temp

SELECT  *
FROM    ( SELECT OfficeID ,
                    ROW_NUMBER() OVER ( PARTITION BY OfficeID ORDER BY idcol ) rn ,
                    idcol
          FROM      #temp
        ) result
WHERE   rn = 1
ORDER BY result.idcol DESC;