2015-09-28 54 views
4

我有点新手到SQL,但一直在使用SQLFiddle玩弄它,以获得更好的。如果您想查找并列出所有具有在不同表格中共享的列或列的表格(例如,表格1,2,3,& 4有一个客户字段,而表格2 & 4有一个学生字段? ?你会如何做,与MySQL假设你有100多个表,而不是2列出共享相同的确切列名的所有表

Table 1: 

ID | Customer | Pet | 

Table 2: 

ID | Customer | Food | Student | 

Table 3: 

ID | Customer | Activity | 

Table 4: 

ID | Customer | Cost | Student 

预期的结果:

Table_NAME | COLUMN_NAME

Table 1, Table 2, Table 3, Table 4 | ID 

Table 1, Table 2, Table 3, Table 4 | CUSTOMER 

Table 2, Table 4 | Student 

我都尝试下面并没有给我什么,我一直在寻找:

select Table_NAME, COLUMN_NAME, Count(*) 
from INFORMATION_SCHEMA.columns 
GROUP BY Table_NAME 
HAVING COUNT(*) > 1 


SELECT Table_Name, Column_Name 
FROM INFORMATION_SCHEMA.columns 
WHERE TABLE_NAME IN 
( SELECT TABLE_NAME 
     FROM INFORMATION_SCHEMA.columns 
     GROUP BY TABLE_NAME 
     HAVING COUNT(*) > 1 
) 
ORDER BY TABLE_NAME 
+0

如果你是新的SQL,来这里的一般GROUP BY规则:如果指定了GROUP BY子句,在SELECT列表中的每个列引用必须要么确定分组列或者是一组函数的参数。 (MySQL在这里做的事情不同......) – jarlh

+0

@jarlh对于MySql,它实际上取决于mysql版本。在5.3.4之前(不确定是否这是一个)虽然它允许你做一个没有完整列的选择(我总是认为这是一团糟)看到这个答案:http://stackoverflow.com/a/1646121/460557 –

回答

2

尝试:

select GROUP_CONCAT(TABLE_NAME) TABLE_NAME, COLUMN_NAME 
from INFORMATION_SCHEMA.COLUMNS 
GROUP BY COLUMN_NAME 
HAVING COUNT(*) > 1 

上面的查询将会给表/列信息来自数据库中的所有架构。

如果你想限制数据到一个特定的模式然后;

select GROUP_CONCAT(TABLE_NAME) TABLE_NAME, COLUMN_NAME 
from INFORMATION_SCHEMA.COLUMNS 
where TABLE_SCHEMA = 'your_schema' 
GROUP BY COLUMN_NAME 
HAVING COUNT(*) > 1 
+0

辉煌。哇,这工作像魔术。很少有人问你... 1)我不能做什么选择CONCAT(TABLE_NAME,',',TABLE_NAME)与做GROUP_CONCAT(Table_NAME)Table_Name相反? 2)当你做GROUP_CONCAT时,你如何添加一个分隔符,接着是空格? – Dwayne

相关问题