如何在不更改实际订单的情况下从SQL列中检索唯一数据?

时间:2015-10-07 14:59:01

标签: sql-server-2008

我有一个带guid的列,并且有重复的条目。 例如GuidTable

guid
------------------------------------
7AAB93D4-3DAC-46F4-8E2A-2D43EF4033A0 

E753EBF7-3A13-4D25-B1BE-65BAD17F7097 

B9C61AAF-A625-4BF8-9BA8-8C4EFDA9E53B

B563F832-16A7-4F17-91C1-D9C5672DDB3E

**9FF90E75-16DD-4B01-9A1D-5BEB20564C63**

**9FF90E75-16DD-4B01-9A1D-5BEB20564C63**

如果我表演 从GuidTable结果中选择不同的guid,

guid
-------------
7AAB93D4-3DAC-46F4-8E2A-2D43EF4033A0

9FF90E75-16DD-4B01-9A1D-5BEB20564C63

E753EBF7-3A13-4D25-B1BE-65BAD17F7097

B9C61AAF-A625-4BF8-9BA8-8C4EFDA9E53B

B563F832-16A7-4F17-91C1-D9C5672DDB3E

此处检索的数据的顺序是改变的,即不是表中的实际顺序。

如何克服这个? 我需要具有不同guid的非排序数据(应该与表顺序相同)。

非常感谢提前.. :)在这里输入代码

1 个答案:

答案 0 :(得分:0)

首先,没有有序表这样的东西。查询优化器可以按任何顺序检索数据,尤其是涉及并行执行时。保证订单的唯一方法是使用ORDER BY子句。如果您的表格中包含以下列:ID IDENTITY或创建日期,则可以使用它来订购结果集。

如果没有,您可以创建“半行号”:

<强> Demo

CREATE TABLE #GuidTable(guid UNIQUEIDENTIFIER);

INSERT INTO #GuidTable(guid)
VALUES
('7AAB93D4-3DAC-46F4-8E2A-2D43EF4033A0'),
('E753EBF7-3A13-4D25-B1BE-65BAD17F7097'),
('B9C61AAF-A625-4BF8-9BA8-8C4EFDA9E53B'),
('B563F832-16A7-4F17-91C1-D9C5672DDB3E'),
('9FF90E75-16DD-4B01-9A1D-5BEB20564C63'),
('9FF90E75-16DD-4B01-9A1D-5BEB20564C63');

SELECT *, rn = ROW_NUMBER() OVER (ORDER BY (SELECT 1))
INTO #temp
FROM #GuidTable;

SELECT guid, MAX(rn) as rn
FROM #temp
GROUP BY guid
ORDER BY rn;

警告!如果未按顺序提取数据,则可能无法保留订单。正如我之前所写,您需要另一列进行订购。