【发布时间】:2015-09-28 13:35:13
【问题描述】:
我对 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
【问题讨论】:
-
如果您是 SQL 新手,这里有一个通用的 GROUP BY 规则:如果指定了 GROUP BY 子句,则 SELECT 列表中的每个列引用必须标识一个分组列或者是一个分组列的参数设置功能。 (MySQL 在这里做的事情不同......)
-
@jarlh 对于 MySql 它实际上取决于 mysql 版本。在 5.3.4 之前(不确定这是否是一个),它允许您在没有完整列的情况下进行分组(我一直认为这是一团糟),请参阅此答案:stackoverflow.com/a/1646121/460557