如何在不列出表中所有其他列的情况下从select distinct中排除GUID?

时间:2014-03-07 19:28:41

标签: sql sql-server select distinct guid

所以,让我们说' table'有两列充当GUID - ID列和msrepl_tran_version。我们的原始程序员不知道我们的复制创建了这个列,并将其包含在一个比较中,这导致将近20,000条记录放入此表中,其中只有1,588个实际上是唯一的,并且它导致了很长的加载时间

我正在寻找一种方法从select distinct中排除ID和复制列,而不必列出表中的每一列,因为我将不得不从记录中选择多次设置来解决这个问题(还有其他表受到影响,查询会很荒谬)如果我能提供帮助,我不想处理我的代码。

有没有办法在不列出所有其他列的情况下完成此任务?

Select distinct {* except ID, msrepl_tran_version} from table

除了(其中COL_1是ID,COL_N是复制GUID)

Select distinct COL_2, ..., COL_N-1, COL_N+1, ... from table

3 个答案:

答案 0 :(得分:2)

经过更多搜索,我找到了答案:

SELECT * INTO #temp FROM table
ALTER TABLE #temp DROP COLUMN id
ALTER TABLE #temp DROP COLUMN msrepl_tran_version
SELECT DISTINCT * FROM #temp

这适用于我需要的东西。谢谢你的答案!

答案 1 :(得分:1)

当然,100%不可能,没有减法列指令。

答案 2 :(得分:1)

不能以OP的初始问题的精神来完成。但是,它可以使用动态sql完成:

--Dynamically build list of column names.
DECLARE @ColNames NVARCHAR(MAX) = ''

SELECT @ColNames = @ColNames + '[' + c.COLUMN_NAME + '],'
FROM INFORMATION_SCHEMA.COLUMNS c
WHERE c.TABLE_SCHEMA = 'dbo'
AND c.TABLE_NAME = 'YourTable'
--Exclude these.
AND c.COLUMN_NAME NOT IN ('ID', 'msrepl_tran_version')
--Keep original column order for appearance, convenience.
ORDER BY c.ORDINAL_POSITION

--Remove trailing comma.
SET @ColNames = LEFT(@ColNames, LEN(@ColNames) - 1)

--Verify query
PRINT ('SELECT DISTINCT ' + @ColNames + ' FROM [dbo].[YourTable]')

--Uncomment when ready to proceed.
--EXEC ('SELECT DISTINCT ' + @ColNames + ' FROM [dbo].[YourTable]')

另外需要注意:由于您需要多次从记录集中进行选择并可能连接到其他表,因此您可以使用上述方法在表上创建视图。这应该使你的代码相当干净。