2014-12-23 22 views
7

Mam surowe dane z milionami wierszy i bez ograniczeń i chcę zidentyfikować unikalne kolumny dla kluczy podstawowych za pomocą kodu SQL.Identyfikowanie głównych kandydatów za pomocą kodu SQL

Czy istnieje sposób identyfikacji głównych kandydatów za pomocą kodu SQL?

+0

Czy chodzi ci o wybór kolumny, która będzie używana jako klucz podstawowy? Jeśli tak, musisz znaleźć kolumnę, która jest unikalna. – Sparky

+0

Przez "zidentyfikować klucz podstawowy" zakładam, że masz na myśli identyfikację unikalnej kolumny, która będzie używana jako klucz podstawowy? – AeroX

+2

? Znajdź kolumnę lub zestaw kolumn tak, że 'SELECT COUNT (*) ...' jest tym samym, co 'SELECT COUNT (DISTINCT candidatekey (s)) FROM' ... jednak zajmie kilka skanów tabeli? – StuartLC

Odpowiedz

9

można spróbować następujących zapytań

select count(<potential_column>),count(distinct <potential column>) from <table> 

Gdy liczy się dopasować, trzeba klucza kandydującego do rozpatrzenia.

Na przykład, gdybym miał stolik osób o nazwie LUDZIE, mógłbym zrobić coś takiego.

select 'FullName' as FldName, count(fullname) as Tot,count(distinct fullName) as TotD 
from People 
union 
select 'SSN' as FldName, count(SSN) as Tot,count(distinct SSN) as TotD 
from People 

Spowoduje to wyświetlenie dwóch wierszy z nazwą pola i liczbą. Każdy wiersz, w którym tot pasuje do totd byłby kandydatem, chociaż w tym przykładzie polegałbym na numerze SSN (numer ubezpieczenia społecznego) na podstawie wiedzy o danych.

można uruchomić tę samą kwerendę przy użyciu pól połączone, takich jak

select 'First/Last' as FldName, count(Firstname+lastName) as Tot, 
      count(distinct firstname+LastName) as TotD 
    from People 

jeśli szukasz kluczy złożonych, choć stara się zdecydować, które pola do łączenia wymaga lepszego zrozumienia swoich danych

+0

czy możesz podać przykład tego samego z pewną nazwą tabeli . Będzie to wartość dodana –

0

można użyć następującego kodu w celu uzyskania listy unikatowych kolumn tabeli:

DECLARE 
    @TableSchema sysname = 'dbo' 
    ,@TableName sysname = 'Task' 
    ,@ColumnName sysname='' 
    ,@sql nvarchar(max)='' 
; 
--- 
DECLARE c CURSOR FOR (SELECT [COLUMN_NAME] FROM [INFORMATION_SCHEMA].[COLUMNS] WHERE [TABLE_SCHEMA] = @TableSchema AND [TABLE_NAME] = @TableName); 
OPEN c; 
FETCH NEXT FROM c INTO @ColumnName; 
WHILE @@FETCH_STATUS = 0 BEGIN 
    SET @sql += 'SELECT '''[email protected]+''' FROM '+QUOTENAME(@TableSchema)+'.'+QUOTENAME(@TableName)+' HAVING COUNT(*)=COUNT(DISTINCT '+QUOTENAME(@ColumnName)+')'; 
    FETCH NEXT FROM c INTO @ColumnName; 
    IF @@FETCH_STATUS = 0 SET @sql += 'UNION ALL '; 
END; 
CLOSE c; 
DEALLOCATE c; 
EXEC SP_EXECUTESQL @sql; 
--- 

niekoniecznie jest najlepszym sposobem, aby wybrać klucz podstawowy, chyba że możesz zagwarantować, że kolumna nie będzie miała duplikatów w przyszłości. Kod ten może być jednak przydatny podczas analizy zestawów danych, aby odkryć, które kolumny mają zwykle unikalne wartości.

1

Chociaż możliwe jest (jak za odpowiedzi i komentarzy) w celu wykrycia, czy permutacje istniejących danych w tabeli jest unikatowy lub nie, w każdym miejscu, w którym nie jest oczywiste, że istnieje oczywista surogat fizyczna lub istniejących klucz w tabeli, zamiast próbować utworzyć pseudo primary key z jednej lub więcej kolumn kolumnowych danych przez zgadywanie lub dedukowanie unikalności danych, utworzyłbym zamiast tego nowy zastępczy klucz podstawowy, np. liczba całkowita IDENTITY lub UNIQUEIDENTIFIER.

Uzasadnienie

  • Zaprojektowaliśmy to być niepowtarzalny, zamiast nadzieję, że będzie on nadal być unikalne. Na przykład datetime/timestampy mają paskudny zwyczaj nie być unikalny.
  • Będziemy wymienić kolumnę odpowiednio tak, że inni będą natychmiast rozpozna go jako klucz podstawowy
  • To może być węższy niż klucz kompozytowych wykonanych z innych przypadkowych kolumn
+0

To jest to, co zwykle robię zawsze przy projektowaniu stołu, w którym potrzebuję unikalnego identyfikatora i nie da się łatwo zidentyfikować w danych – AeroX

+3

Zdecydowanie się zgadzam, surogat ma dużo sensu, chyba że istnieje jest bardzo wyraźnym kandydatem na klucz podstawowy, a nawet wtedy nadal rozważałbym klucz zastępczy. – Sparky

1

Jeśli tabela ma 10 Brak -nullable kolumny to ma 1024 możliwych zestawów atrybutów (= power set), z których każdy może być kluczem. Czy naprawdę chcesz przetestować je wszystkie?

Jedyny rozważny i niezawodny sposób określania kluczy jest oparty na podstawowych zasadach: analiza wymagań biznesowych w oparciu o zrozumienie danych, które mają reprezentować dane. W przypadku braku tej analizy i zrozumienia, skąd wiadomo, czy dane są rzetelną, dokładną próbką, z której można wywnioskować odpowiednie klucze? Jeśli tabela nie zawierała żadnych ograniczeń kluczowych w przeszłości, być może zawiera już błędnie zduplikowane dane.

+3

Rozsądna odpowiedź. Kiedy pytanie brzmi "Jak zastrzelić się w stopie?" właściwa odpowiedź nie jest "Krok 1: załaduj broń ..." – TommCatt

0

Co powiesz na użycie sp_special_columns w celu znalezienia unikalności? Wygląda (z Googling), że ten sproc jest zaprojektowany w celu znalezienia wyjątkowości, definicja MSFT sp_special_columns: "Zwraca optymalny zestaw kolumn, które jednoznacznie identyfikują wiersz w tabeli. Zwraca również kolumny automatycznie aktualizowane, gdy dowolna wartość w wierszu jest aktualizowana przez transakcja. "