首先,无论你如何分割它,你都需要一个唯一的键。它可以是列的组合,但您绝对必须有一些唯一标识每一行的方法。没有它,你最好的办法是添加这样的约束。除了这个限制之外,这种类型的请求最好还具有一个唯一的列。但是,如果您没有这样的列,则可以通过将它们连接在一起来从包含唯一键的列中创建它:
Select T1.account, T1.phone, T1.subaccount, T1.locationId....
From "Table" As T1
Where (Cast(T1.UniqueCol1 As varchar(100))
+ "|" + Cast(T2.UniqueCol2 As varchar(100)
... ) = (
Select Min( Cast(T2.UniqueCol1 As varchar(100))
+ "|" + Cast(T2.UniqueCol2 As varchar(100))
...
)
From "Table" As T2
Where T2.account = T1.account
And T2.phone = T1.phone
)
在这种情况下UniqueCol1
,代表唯一键的列之一,UniqueCol2
代表下一个,依此类推。无论如何,这都不是一个快速查询。保证单个列是唯一的将使这个问题变得更加简单。有了这个,你可以做一些类似于 Mike M 的解决方案:
Select T1.account, T1.phone, T1.subaccount, T1.locationId....
From "Table" As T1
Where UniqueCol = (
Select Min( T2.UniqueCol )
From "Table" As T2
Where T2.account = T1.account
And T2.phone = T1.phone
)
这里要指出的重要一点是,在上述两种解决方案中,“第一”仅由找到的最低排序键值确定。如果“第一”需要由其他东西来确定,比如日期时间列,你需要在你的帖子中提到你的。
编辑
鉴于您添加这是一个导入,最简单的解决方案是向您的临时表添加一个自动递增列。在 SQL Server 中,这将是一个 IDENTITY 列,但其他数据库产品有一个等效列。如果你这样做了,那么我上面介绍的最后一个解决方案就可以解决问题(只需将 UniqueCol 替换为你的 Identity 列的名称)。