【问题标题】:How can I exclude GUIDs from a select distinct without listing all other columns in a table?如何在不列出表中所有其他列的情况下从 select distinct 中排除 GUID?
【发布时间】:2014-04-11 03:01:33
【问题描述】:

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

我正在寻找一种方法从选择的不同列中排除 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

【问题讨论】:

  • 恕我直言,这是不可能的
  • 最佳做法是明确列出列

标签: sql sql-server select distinct guid


【解决方案1】:

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

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

这可以满足我的需要。谢谢大家的回答!

【讨论】:

    【解决方案2】:

    不能按照 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]')
    

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

    【讨论】:

      【解决方案3】:

      绝对,100% 不可能,没有减列指令。

      【讨论】:

        猜你喜欢
        • 2012-06-10
        • 2012-10-15
        • 1970-01-01
        • 2011-12-16
        • 2018-05-09
        • 2018-11-22
        • 1970-01-01
        相关资源
        最近更新 更多