【问题标题】:List all the tables that share the same exact column names列出所有共享相同确切列名的表
【发布时间】: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

标签: mysql sql database


【解决方案1】:

试试:

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

【讨论】:

  • 太棒了。哇,这就像魔术一样。给你几个问题... 1)我为什么不能选择 CONCAT (TABLE_NAME,', ', TABLE_NAME) 而不是 GROUP_CONCAT(Table_NAME) Table_Name? 2)当你做GROUP_CONCAT时,你怎么能添加一个分隔符,比如,后跟空格?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
  • 2020-09-24
  • 2019-05-13
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
相关资源
最近更新 更多