Есть ли способ в SQL (SQL Server) найти столбец, который может работать как уникальный ключ для таблицы?

  1. У меня есть два CSV-файла, сделанные из таблицы базы данных.
  2. Одна резервная копия старше на месяц, чем другая.
  3. Мне нужно найти различия в них, сравнивая два CSV: S
  4. Обычно я бы использовал первый столбец, id, как уникальный идентификатор, как ключ для сравнения строк, но в этом случае он недоступен.
  5. В таблице есть десятки столбцов, поэтому наверняка найдется столбец с уникальными значениями. Это означает, что никакие две или более строки не имеют одинаковое значение в этом столбце.

Есть ли SQL-запрос или какой-либо способ найти столбец в таблице, который не имеет дубликатов ни в одной строке? Следовательно, этот столбец может использоваться в качестве уникального идентификатора строки. База данных - SQL Server 2012.

2 ответа

Я использовал этот скрипт для аналогичной цели:

USE [Database]

DECLARE @name sysname
DECLARE @cntAll int
DECLARE @cntDist int
DECLARE @cntNull int
DECLARE @err int
DECLARE @stm nvarchar(max)
DECLARE @tblName sysname

SET @tblName = 'Table'

-- All rows
SET @stm = N'SELECT @cntAll = COUNT(*) FROM dbo.[' + @tblName + ']'
EXEC @err = sp_executesql @stm, N'@cntAll int OUTPUT', @cntAll OUTPUT
IF @err <> 0 BEGIN
    RETURN
END

-- Distinct rows by column
DECLARE columns_tables CURSOR GLOBAL FORWARD_ONLY READ_ONLY FOR
SELECT [name] FROM sys.columns WHERE object_id = OBJECT_ID('dbo.[' + @tblName + ']') 

OPEN columns_tables
FETCH NEXT FROM columns_tables INTO @name
WHILE (@@FETCH_STATUS = 0) BEGIN

    SET @stm = 
        N'SELECT @cntDist = COUNT(DISTINCT [' + @name + ']) '+
        'FROM dbo.[' + @tblName + '] '+
        'WHERE [' + @name + '] IS NOT NULL'
    EXEC @err = sp_executesql @stm, N'@cntDist int OUTPUT', @cntDist OUTPUT
    IF @err <> 0 BEGIN
        CLOSE columns_tables
        DEALLOCATE columns_tables
        BREAK
    END

    SET @stm = 
        N'IF EXISTS (' +
            'SELECT ([' + @name + ']) '+
            'FROM dbo.[' + @tblName + '] '+
            'WHERE [' + @name + '] IS NULL'+
        ') SET @cntNull = 1 '+
        'ELSE SET @cntNull = 0'
    EXEC @err = sp_executesql @stm, N'@cntNull int OUTPUT', @cntNull OUTPUT
    IF @err <> 0 BEGIN
        CLOSE columns_tables
        DEALLOCATE columns_tables
        BREAK
    END

    IF (@cntAll = @cntDist) AND (@cntNull = 0) BEGIN
        PRINT 'Possible column ' + @name
    END

    FETCH NEXT FROM columns_tables INTO @name
END
CLOSE columns_tables
DEALLOCATE columns_tables

Вы можете написать скрипт для группировки по всем столбцам индивидуально и посмотреть количество. Вы можете найти поля, которые наиболее различимы. Вы можете объединить поля, чтобы сделать его более четким. Удачи!

Другие вопросы по тегам