Есть ли способ в SQL (SQL Server) найти столбец, который может работать как уникальный ключ для таблицы?
- У меня есть два CSV-файла, сделанные из таблицы базы данных.
- Одна резервная копия старше на месяц, чем другая.
- Мне нужно найти различия в них, сравнивая два CSV: S
- Обычно я бы использовал первый столбец, id, как уникальный идентификатор, как ключ для сравнения строк, но в этом случае он недоступен.
- В таблице есть десятки столбцов, поэтому наверняка найдется столбец с уникальными значениями. Это означает, что никакие две или более строки не имеют одинаковое значение в этом столбце.
Есть ли 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
Вы можете написать скрипт для группировки по всем столбцам индивидуально и посмотреть количество. Вы можете найти поля, которые наиболее различимы. Вы можете объединить поля, чтобы сделать его более четким. Удачи!