2015-09-28 80 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

相關問題