★★★ 讨论Oracle数据字典查询SQL (有点小问题恳请指正,谢谢!)
SELECT
A.COLUMN_ID AS COLUMNORDERID,
A.COLUMN_NAME AS COLUMNNAME,
C.CONSTRAINT_NAME,
D1.CONSTRAINT_TYPE,
D1.R_CONSTRAINT_NAME,
CASE WHEN EXISTS (SELECT * FROM USER_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'P ' AND CONSTRAINT_NAME IN (SELECT CONSTRAINT_NAME FROM USER_CONS_COLUMNS WHERE COLUMN_NAME = A.COLUMN_NAME)) THEN '√ ' ELSE ' ' END AS PK,
CASE WHEN (D2.TABLE_NAME|| '. '||D2.COLUMN_NAME)= '. 'THEN ' ' ELSE (D2.TABLE_NAME|| '. '||D2.COLUMN_NAME) END AS FK,
A.DATA_TYPE AS DATATYPE,
CASE WHEN A.DATA_PRECISION IS NULL THEN TO_CHAR(A.DATA_LENGTH) ELSE TO_CHAR(A.DATA_PRECISION)|| ', '||TO_CHAR(A.DATA_SCALE) END AS DATALENGTH,
CASE WHEN A.NULLABLE = 'Y ' THEN '√ ' ELSE ' ' END AS NULLABLE,
A.DATA_DEFAULT AS DATADEFAULT,
B.COMMENTS AS COLUMNDESCRIPTION
FROM USER_TAB_COLUMNS A ,USER_COL_COMMENTS B,USER_CONS_COLUMNS C,USER_CONSTRAINTS D1,USER_CONS_COLUMNS D2
WHERE
A.TABLE_NAME=B.TABLE_NAME AND
A.COLUMN_NAME=B.COLUMN_NAME AND
A.COLUMN_NAME=C.COLUMN_NAME(+) AND
C.CONSTRAINT_NAME = D1.CONSTRAINT_NAME(+) AND
D1.R_CONSTRAINT_NAME = D2.CONSTRAINT_NAME(+) AND
A.TABLE_NAME= '表名 '
ORDER BY A.COLUMN_ID
/*
您用您的表名替换以上SQL中 "表名 ",即可查询出当前表的相关信息.
序号/字段名/PK/FK/数据类型/长度/是否为空/默认值/字段描述
但存在以下问题:
因为要把所引用的外键显示在外键后,所以上面的左连接可能有点混乱.结果就会有偏差:如,一字段为主键,肯定不为空,那查询结果便会有两条.因为在表USER_CONS_COLUMNS中有两条相关列的记录,同样,如果有多条,那结果就更离谱了.
其他问题暂未发现.
恳请多多指正!谢谢!
*/
------解决方案--------------------SELECT
A.COLUMN_ID AS COLUMNORDERID,
A.COLUMN_NAME AS COLUMNNAME,
C.CONSTRAINT_NAME,
D1.CONSTRAINT_TYPE,
D1.R_CONSTRAINT_NAME,
CASE WHEN EXISTS (SELECT * FROM USER_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'P ' AND CONSTRAINT_NAME IN (SELECT CONSTRAINT_NAME FROM USER_CONS_COLUMNS WHERE COLUMN_NAME = A.COLUMN_NAME)) THEN '¡Ì ' ELSE ' ' END AS PK,
CASE WHEN (D2.TABLE_NAME|| '. '||D2.COLUMN_NAME)= '. 'THEN ' ' ELSE (D2.TABLE_NAME|| '. '||D2.COLUMN_NAME) END AS FK,
A.DATA_TYPE AS DATATYPE,
CASE WHEN A.DATA_PRECISION IS NULL THEN TO_CHAR(A.DATA_LENGTH) ELSE TO_CHAR(A.DATA_PRECISION)|| ', '||TO_CHAR(A.DATA_SCALE) END AS DATALENGTH,
CASE WHEN A.NULLABLE = 'Y ' THEN '¡Ì ' ELSE ' ' END AS NULLABLE,
A.DATA_DEFAULT AS DATADEFAULT,
B.COMMENTS AS COLUMNDESCRIPTION
FROM USER_TAB_COLUMNS A ,USER_COL_COMMENTS B,USER_CONS_COLUMNS C,USER_CONSTRAINTS D1,USER_CONS_COLUMNS D2
WHERE
A.TABLE_NAME=B.TABLE_NAME AND
A.COLUMN_NAME=B.COLUMN_NAME AND
A.COLUMN_NAME=C.COLUMN_NAME(+) AND a.table_name = c.table_name(+) and c.position(+)= '1 ' and
c.CONSTRAINT_NAME = D1.CONSTRAINT_NAME(+) AND c.table_name = d1.table_name(+) and
D1.R_CONSTRAINT_NAME = D2.CONSTRAIN