Sql 信息\u架构视图每列返回多行

Sql 信息\u架构视图每列返回多行,sql,Sql,我试图编写一个查询,它将为我提供有关给定数据库列的某些关键信息,但到目前为止,我的查询似乎返回了一些奇怪的结果!我需要了解有关列大小、可空性、唯一性等方面的信息 那么为什么我要在每列中得到多个结果呢 SELECT C.COLUMN_NAME AS COLUMN_NAME, C.TABLE_NAME AS TABLE_NAME, C.CHARACTER_MAXIMUM_LENGTH AS CHARACTER_MAXIMUM_LENGTH, C.COLUMN_DEFAULT AS COLUMN_DE

我试图编写一个查询,它将为我提供有关给定数据库列的某些关键信息,但到目前为止,我的查询似乎返回了一些奇怪的结果!我需要了解有关列大小、可空性、唯一性等方面的信息

那么为什么我要在每列中得到多个结果呢

SELECT
C.COLUMN_NAME AS COLUMN_NAME,
C.TABLE_NAME AS TABLE_NAME,
C.CHARACTER_MAXIMUM_LENGTH AS CHARACTER_MAXIMUM_LENGTH,
C.COLUMN_DEFAULT AS COLUMN_DEFAULT,
C.DATA_TYPE AS DATA_TYPE,
C.IS_NULLABLE AS IS_NULLABLE,
CASE WHEN EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'PRIMARY KEY'
AND CONSTRAINT_NAME = CC.CONSTRAINT_NAME) THEN 1 ELSE 0 END AS IS_PRIMARY_KEY,
CASE WHEN EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'UNIQUE'
AND CONSTRAINT_NAME = CC.CONSTRAINT_NAME) THEN 1 ELSE 0 END AS IS_UNIQUE,
C.NUMERIC_PRECISION AS NUMERIC_PRECISION,
C.NUMERIC_SCALE AS NUMERIC_SCALE,
FK.TABLE_NAME AS FOREIGN_KEY_TABLE_NAME,
FK.COLUMN_NAME AS FOREIGN_KEY_COLUMN_NAME

FROM INFORMATION_SCHEMA.COLUMNS C
LEFT OUTER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CC
ON C.COLUMN_NAME = CC.COLUMN_NAME
AND C.TABLE_NAME = CC.TABLE_NAME
LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC
ON CC.CONSTRAINT_NAME = TC.CONSTRAINT_NAME

LEFT OUTER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC
ON TC.CONSTRAINT_NAME = RC.CONSTRAINT_NAME
LEFT OUTER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE FC
ON RC.UNIQUE_CONSTRAINT_NAME = FC.CONSTRAINT_NAME

LEFT OUTER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE FK
ON FC.COLUMN_NAME = FK.COLUMN_NAME
AND FC.TABLE_NAME = FK.TABLE_NAME
WHERE COLUMNPROPERTY(OBJECT_ID(C.TABLE_SCHEMA + '.' + C.TABLE_NAME), C.COLUMN_NAME, 'IsComputed') = 0
AND TC.CONSTRAINT_TYPE = 'FOREIGN KEY'

每列可能有多个约束,因此如果与包含约束信息的视图合并,则会得到多行,每列上的一个约束对应一行

另一个原因可能是相同的列和表名出现在不同的模式中

您可以使用以下查询检查重复项,该查询仅显示多次出现的列:

WITH a as(
    SELECT
    C.COLUMN_NAME AS COLUMN_NAME,
    C.TABLE_NAME AS TABLE_NAME,
    C.CHARACTER_MAXIMUM_LENGTH AS CHARACTER_MAXIMUM_LENGTH,
    C.COLUMN_DEFAULT AS COLUMN_DEFAULT,
    C.DATA_TYPE AS DATA_TYPE,
    C.IS_NULLABLE AS IS_NULLABLE,
    CASE WHEN EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE     CONSTRAINT_TYPE = 'PRIMARY KEY'
    AND CONSTRAINT_NAME = CC.CONSTRAINT_NAME) THEN 1 ELSE 0 END AS IS_PRIMARY_KEY,
    CASE WHEN EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE     CONSTRAINT_TYPE = 'UNIQUE'
    AND CONSTRAINT_NAME = CC.CONSTRAINT_NAME) THEN 1 ELSE 0 END AS IS_UNIQUE,
    C.NUMERIC_PRECISION AS NUMERIC_PRECISION,
    C.NUMERIC_SCALE AS NUMERIC_SCALE,
    FK.TABLE_NAME AS FOREIGN_KEY_TABLE_NAME,
    FK.COLUMN_NAME AS FOREIGN_KEY_COLUMN_NAME

    FROM INFORMATION_SCHEMA.COLUMNS C
    LEFT OUTER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CC
    ON C.COLUMN_NAME = CC.COLUMN_NAME
    AND C.TABLE_NAME = CC.TABLE_NAME
    LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC
    ON CC.CONSTRAINT_NAME = TC.CONSTRAINT_NAME

    LEFT OUTER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC
    ON TC.CONSTRAINT_NAME = RC.CONSTRAINT_NAME
    LEFT OUTER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE FC
    ON RC.UNIQUE_CONSTRAINT_NAME = FC.CONSTRAINT_NAME

    LEFT OUTER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE FK
    ON FC.COLUMN_NAME = FK.COLUMN_NAME
    AND FC.TABLE_NAME = FK.TABLE_NAME
    WHERE COLUMNPROPERTY(OBJECT_ID(C.TABLE_SCHEMA + '.' + C.TABLE_NAME), C.COLUMN_NAME,     'IsComputed') = 0
    AND TC.CONSTRAINT_TYPE = 'FOREIGN KEY'
), b as (
    SELECT COLUMN_NAME, TABLE_NAME
      FROM a
    GROUP BY COLUMN_NAME, TABLE_NAME
    HAVING count(*) > 1
)
SELECT a.*
  FROM a JOIN b ON a.COLUMN_NAME = b.COLUMN_NAME AND a.TABLE_NAME = b.TABLE_NAME

CTE
a
正是您从上面进行的查询。

每当您向查询添加一个
JOIN
时,该关系就有可能是一对多的,从而将结果相乘。这里有5个
JOIN
s,因此可能其中一个属于这种情况

我的猜测是,多个约束可以应用于单个列,而您没有筛选出足够的可能性使其不适用


关键是查看您得到的结果,并查看“重复”行中的实际差异。我有时使用类似于
SELECT C.*.'-'as[-]、CC.*.'-'as[-]、…
的查询来显示所有联接表的所有列。(在Postgres中,`-`在MySQL中,`-`的
as[-]
将是
as”--“

是的,对不起,你是对的,deleted@Yaroslav没问题。我必须说,这种编码风格确实让人想起MS/Sybase/Oracle老实说,我通常只大写我的关键字。:)旁白:任何人都知道如何在一个代码的中间输出一个文字“在StaseFuffic语法中的代码跨度?啊,但是我假设<代码>和TC.MultTyType =‘外键’< /Cult>会限制返回的约束。一个列不能同时有两个外键,或者至少不能在我的数据库中!但是,一个列可能是多个外键的目标,并且以这种方式列出信息?