我正在使用一个没有定义主键或唯一键约束的 MSSQL 表。有两个字段,我们称它们为 xId 和 yId,我相信它们一起将是一个复合键,但我想通过检查数据来确认这一点。
我在想我应该能够编写一个 SQL 计数语句,我可以将它与表上的记录总数进行比较,这将在逻辑上确定 xId 和 yId 的组合(或第三列 id 必要)实际上是否可以充当复合键。但是,我无法提出正确的 GROUP BY 或其他类型的子句来确认或反驳这一点。
有任何想法吗?
我正在使用一个没有定义主键或唯一键约束的 MSSQL 表。有两个字段,我们称它们为 xId 和 yId,我相信它们一起将是一个复合键,但我想通过检查数据来确认这一点。
我在想我应该能够编写一个 SQL 计数语句,我可以将它与表上的记录总数进行比较,这将在逻辑上确定 xId 和 yId 的组合(或第三列 id 必要)实际上是否可以充当复合键。但是,我无法提出正确的 GROUP BY 或其他类型的子句来确认或反驳这一点。
有任何想法吗?
使用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
形成一个唯一标识符,那么这两个数字将是相同的。
或者,您可以计算不同的 and 对的数量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