在我的陈述中加入
时遇到了一些麻烦这个没问题
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
有什么想法吗?
答案 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.FieldName
或TableAliasName.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