Логически определите составной ключ в SQL


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

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

Есть идеи?

3 3

3 ответа:

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

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

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

Просто сделайте 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) пары формируют уникальный идентификатор для вашей таблицы.

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

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