所以,我已经看到很多关于查找具有特定列名的表的问题。但是,我正在尝试查找没有特定列的所有表。 (在这种情况下,EndDate)。是否有一个更优雅的解决方案,而不仅仅是找到该列的所有表,并将其与所有表的列表进行比较?
答案 0 :(得分:13)
SELECT
table_name
FROM
INFORMATION_SCHEMA.TABLES T
WHERE
T.TABLE_CATALOG = 'MyDB' AND
T.TABLE_TYPE = 'BASE TABLE' AND
NOT EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS C
WHERE
C.TABLE_CATALOG = T.TABLE_CATALOG AND
C.TABLE_SCHEMA = T.TABLE_SCHEMA AND
C.TABLE_NAME = T.TABLE_NAME AND
C.COLUMN_NAME = 'EndDate')
答案 1 :(得分:1)
尝试以下方法,它是标准的SQL(几乎适用于所有平台)
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
EXCEPT
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME = 'EndDate'
正如你的建议,你不可能得到任何比这更简单的东西。
答案 2 :(得分:1)
这应该这样做。
SELECT * FROM INFORMATION_SCHEMA.TABLES t
WHERE NOT EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS c
WHERE c.TABLE_NAME = t.TABLE_NAME AND c.TABLE_SCHEMA=t.TABLE_SCHEMA
AND c.COLUMN_NAME='EndDate')
答案 3 :(得分:0)
我拥有的模式和表比我本应拥有的更多,因此我需要一个可以在一秒钟内运行的优化版本。
为什么不获取所有表,然后获取具有该字段的所有表,proxy: {
'/myService/*': 'https://myServiceEndPoint/',
},
这些结果,并仅在UNION ALL
处显示表名?这就是我所做的
请注意下面两个变量的更改:HAVING COUNT(table_name) = 1
和YourSchemaHere
。
YourFieldHere
SQL Fiddle上的在线演示:http://sqlfiddle.com/#!9/791dde/1/0
我的方法的说明:
SELECT TABLE_NAME, COUNT(TABLE_NAME) FROM (
(SELECT DISTINCT c1.TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS c1
WHERE c1.Table_Schema = "YourSchemaHere")
UNION ALL
(SELECT DISTINCT c2.TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS c2
WHERE c2.Table_Schema = "YourSchemaHere" AND
c2.Column_Name = "YourFieldHere")
) x GROUP BY TABLE_NAME
HAVING COUNT(TABLE_NAME) = 1;
SELECT DISTINCT c1.TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS c1 WHERE c1.Table_Schema = "YourSchemaHere"
的表SELECT DISTINCT c2.TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS c2 WHERE c2.Table_Schema = "YourSchemaHere" AND c2.Column_Name = "YourFieldHere"
这两个结果。UNION ALL