进行JOIN时出现不明确的列名

时间:2014-08-08 10:34:50

标签: sql sql-server-2008 tsql

在我的陈述中加入

时遇到了一些麻烦

这个没问题

select [db_id], COUNT(db_id) AS total
FROM [dbauditor_repo].[dbo].[dbauditor_repo_events]
GROUP BY [db_id]
ORDER BY total DESC

但是我在进行连接时遇到错误(不明确的列名'db_id'。)

SELECT [db_name], [db_id], COUNT(db_id) AS total
FROM [dbauditor_repo].[dbo].[dbauditor_repo_events] JOIN [dbauditor_repo].[dbo].[dbauditor_repo_warehouse]
ON ([dbauditor_repo].[dbo].[dbauditor_repo_events].[db_id] = [dbauditor_repo].[dbo].[dbauditor_repo_warehouse].[db_id])
WHERE [db_type] = 'mysql'
GROUP BY [db_id]
ORDER BY total DESC

有什么想法吗?

4 个答案:

答案 0 :(得分:5)

养成为所有列引用使用表别名的习惯。这将防止此类错误和其他意外问题。最佳做法是使用表缩写。这是一个例子:

SELECT rw.[db_name], re.[db_id], COUNT(re.db_id) AS total
FROM [dbauditor_repo].[dbo].[dbauditor_repo_events] re JOIN
     [dbauditor_repo].[dbo].[dbauditor_repo_warehouse] rw
     ON re.[db_id] = rw.[db_id])
WHERE rw.[db_type] = 'mysql'
GROUP BY rw.[db_name], re.[db_id]
ORDER BY total DESC;

当然,我必须猜测列来自哪些表。您应该修复查询,使它们来自正确的表。

作为奖励,当使用表别名时,查询更容易编写和阅读。

答案 1 :(得分:3)

在连接表时,您需要使用完全限定名称,并且该列存在于多个表中。

尝试:

SELECT [dbauditor_repo_events].[db_id]

您还需要在db_name子句中包含列GROUP BY,因为此列未汇总。

GROUP BY [dbauditor_repo_events].[db_id], [db_name]

答案 2 :(得分:1)

它位于您的选择和分组中:

SELECT [db_name], [dbauditor_repo_events].[db_id], COUNT([dbauditor_repo_events].db_id) AS total
FROM [dbauditor_repo].[dbo].[dbauditor_repo_events] JOIN [dbauditor_repo].[dbo].[dbauditor_repo_warehouse]
ON ([dbauditor_repo].[dbo].[dbauditor_repo_events].[db_id] = [dbauditor_repo].[dbo].[dbauditor_repo_warehouse].[db_id])
WHERE [db_type] = 'mysql'
GROUP BY [dbauditor_repo_events].[db_id]
ORDER BY total DESC

您应该考虑在查询中对表进行别名以提高可读性,例如:

SELECT [db_name], e.[db_id], COUNT(e.db_id) AS total
FROM [dbauditor_repo].[dbo].[dbauditor_repo_events] as e
JOIN [dbauditor_repo].[dbo].[dbauditor_repo_warehouse] as w
ON (e.[db_id] = w.[db_id])
WHERE [db_type] = 'mysql'
GROUP BY e.[db_id]
ORDER BY total DESC

答案 3 :(得分:1)

<强>问题:

这是因为:

[dbauditor_repo].[dbo].[dbauditor_repo_events]

[dbauditor_repo].[dbo].[dbauditor_repo_warehouse]

具有相同的列名db_id。 Query不知道要使用哪个表的db_id。因此这个错误。

<强>解决方案:

使用TableName.FieldNameTableAliasName.FieldName来避免此错误。将您的查询更改为:

SELECT [db_name], 
       TAB1.[db_id] , 
       COUNT(TAB1.db_id) AS total
FROM 
    [dbauditor_repo].[dbo].[dbauditor_repo_events] AS TAB1
JOIN
    [dbauditor_repo].[dbo].[dbauditor_repo_warehouse] AS TAB2
ON 
    (TAB1.[db_id] = TAB2.[db_id])
WHERE [db_type] = 'mysql'

GROUP BY [db_name],[TAB1.db_id]

ORDER BY total DESC