2014-10-29 64 views
0

下面的脚本有什么问题?我试图找到所有具有以下列名称的表:ItemID,QueryID和CurrencyID。目前,它只给出我提到的3列中有2列的表格,所以其中一列将会丢失。具有3个确切列的搜索表名称

SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE COLUMN_NAME in ('ItemID', 'QueryID', 'CurrencyID') 
GROUP BY TABLE_NAME 
HAVING COUNT(*) = 2; 

回答

3

如果你想所有3个匹配,以及2,你为什么不使用

HAVING COUNT(*) >= 2; 
+0

是不是必须是'HAVING COUNT(*)> = 3'或甚至'HAVING COUNT(*)= 3'?将它设置为'> = 2'仍然会返回只有三个中的两个的表。 **编辑:**刚刚看到您的编辑 – Tom 2014-10-29 18:12:59

+0

@Tom:我不知道OP想要什么。我试图指出正确的方向。 – wallyk 2014-10-29 18:13:34

+0

这是行不通的。我需要包含上述三个列名的所有表。我现在发现了一个使用QlikView软件的工作。 – Bulbul 2014-10-29 19:35:10

2
SELECT t.name 
FROM sys.tables t INNER JOIN sys.columns c 
ON t.object_id = c.object_id 
WHERE c.name IN ('ItemID', 'QueryID', 'CurrencyID') 
GROUP BY t.name 
HAVING COUNT(DISTINCT c.name) >= 3 
+0

第三方数据库不会让我使用sys.tables。不过谢谢。我找到了一个工作。 – Bulbul 2014-10-29 19:36:09

0

备选答案,以避免>/=/>=问题:

这只会在找到所有3个时返回一张表格,但wallyk的答案在给出您的问题时是现场的...选择他是否适合您。

SELECT T.TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES T 
WHERE EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS C1 WHERE T.TABLE_NAME=C1.TABLE_NAME AND C1.COLUMN_NAME='ItemID') 
AND EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS C2 WHERE T.TABLE_NAME=C2.TABLE_NAME AND C2.COLUMN_NAME='QueryID') 
AND EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS C3 WHERE T.TABLE_NAME=C3.TABLE_NAME AND C3.COLUMN_NAME='CurrencyID')