gpt4 book ai didi

sql - 判断一个表是否有一些唯一的列

转载 作者:行者123 更新时间:2023-12-02 09:31:24 25 4
gpt4 key购买 nike

我使用 SQL Server。

有人给了我一些大 table ,它们没有任何限制,没有 key ,什么也没有。

我知道某些列具有独特的值。对于给定的表是否有一种聪明的方法来查找具有唯一值的列?

现在,我通过计算是否有与表中的行一样多的 DISTINCT 值来手动为每一列执行此操作。

SELECT COUNT(DISTINCT col) FROM table

可能可以让光标在所有列上循环,但想听听是否有人知道更智能或内置的函数。

最佳答案

这是一种基本上类似于 @JNK 的方法,但它不是打印计数,而是为每一列返回一个现成的答案,告诉您该列是否仅包含唯一值:

DECLARE @table varchar(100), @sql varchar(max);
SET @table = 'some table name';

SELECT
@sql = COALESCE(@sql + ', ', '') + ColumnExpression
FROM (
SELECT
ColumnExpression =
'CASE COUNT(DISTINCT ' + COLUMN_NAME + ') ' +
'WHEN COUNT(*) THEN ''UNIQUE'' ' +
'ELSE '''' ' +
'END AS ' + COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @table
) s

SET @sql = 'SELECT ' + @sql + ' FROM ' + @table;
PRINT @sql; /* in case you want to have a look at the resulting query */
EXEC(@sql);

它只是将每列的 COUNT(DISTINCT column)COUNT(*) 进行比较。结果将是一个只有一行的表格,其中每列都将包含值 UNIQUE(对于那些没有重复项的列),如果存在重复项则为空字符串。

但是上述解决方案仅适用于那些没有 NULL 的列。应该注意的是,当您想在列上创建唯一约束/索引时,SQL Server 不会忽略 NULL。如果一列仅包含一个 NULL 并且所有其他值都是唯一的,您仍然可以在该列上创建唯一约束(但不能将其设为主键,这需要值的唯一性和不存在 NULL)。

因此,您可能需要对内容进行更彻底的分析,可以通过以下脚本获得:

DECLARE @table varchar(100), @sql varchar(max);
SET @table = 'some table name';

SELECT
@sql = COALESCE(@sql + ', ', '') + ColumnExpression
FROM (
SELECT
ColumnExpression =
'CASE COUNT(DISTINCT ' + COLUMN_NAME + ') ' +
'WHEN COUNT(*) THEN ''UNIQUE'' ' +
'WHEN COUNT(*) - 1 THEN ' +
'CASE COUNT(DISTINCT ' + COLUMN_NAME + ') ' +
'WHEN COUNT(' + COLUMN_NAME + ') THEN ''UNIQUE WITH SINGLE NULL'' ' +
'ELSE '''' ' +
'END ' +
'WHEN COUNT(' + COLUMN_NAME + ') THEN ''UNIQUE with NULLs'' ' +
'ELSE '''' ' +
'END AS ' + COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @table
) s

SET @sql = 'SELECT ' + @sql + ' FROM ' + @table;
PRINT @sql; /* in case you still want to have a look at the resulting query */
EXEC(@sql);

此解决方案通过检查三个值来考虑 NULL:COUNT(DISTINCT column)COUNT(column)COUNT(*) 。它显示的结果与之前的解决方案类似,但列的可能诊断更加多样化:

  • UNIQUE 表示没有重复值且没有 NULL(可以是 PK 或具有唯一约束/索引);

  • UNIQUE WITH SINGLE NULL – 可以猜到,没有重复项,但有一个 NULL(不能是 PK,但可以有唯一的约束/索引);

  • UNIQUE with NULL – 没有重复项,两个或多个 NULL(如果您使用的是 SQL Server 2008,则可以仅对非 NULL 值使用条件唯一索引);

  • 空字符串 – 有重复项,也可能为 NULL。

关于sql - 判断一个表是否有一些唯一的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6941049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com