Логически определить составной ключ в SQL - PullRequest
3 голосов
/ 01 декабря 2011

Я работаю с таблицей MSSQL, для которой не определен первичный или уникальный ключ contratraint.Есть два поля, давайте назовем их xId и yId, которые, как я считаю, вместе будут составным ключом, но я хочу подтвердить это, изучив данные.

Я думаю, что я должен быть в состоянии написатьоператор подсчета SQL, который я могу сравнить с общим числом записей в таблице, которое логически определяет, может ли комбинация xId и yId (или необходим идентификатор третьего столбца) фактически действовать как составной ключ.Тем не менее, у меня возникают проблемы с правильным предложением GROUP BY или другим типом предложения, которое подтвердит или опровергнет это.

Есть идеи?

Ответы [ 3 ]

3 голосов
/ 01 декабря 2011

Используйте group by и having:

select xid,yid
from table
group by xid,yid
having count(1) > 1

Это покажет любые пары, которые не являются уникальными, поэтому, если нет строк, возвращается хороший ключ.

2 голосов
/ 01 декабря 2011

Просто наберите count всех строк таблицы, а затем выполните

select count(1)
from(
    select xid,yid
    from table
    group by xid,yid
)a;

, если все пары xid и yid образуют уникальный идентификатор, тогда эти два числа будутбыть таким же.

В качестве альтернативы, вы можете посчитать количество различных пар xid и yid и найти наибольшее такое число:

select max(num_rows)
from(
    select xid,yid,count(1) as num_rows
    from table
    group by xid,yid
)a;

Результат этого запроса1 тогда и только тогда, когда (xid, yid) пары образуют уникальный идентификатор вашей таблицы.

0 голосов
/ 01 декабря 2011

здесь будут перечислены все проблемные комбинации (если есть) xid, yid:

SELECT
    COUNT(*),xid,yid
    FROM YourTable
    GROUP BY xid,yid
    HAVING COUNT(*)>1
...