我正在开发一个拥有相当大数据库的软件项目。我需要显示从数据库中选择的一些财务数据。
基本上在表TimeEntryDetails中我需要乘以小时*率然后将其与那些工作时间的人分组,然后将这些人归为他们所在城市的人。所以最后我们将总共有墨尔本9999999美元由一起工作这笔金额的人组成。表格以这种方式链接。 BusinessUnit(City) - >资源(人) - > TimeEntry - > TemEntryDetails。
我需要在最后一个表中对财务进行排序。我想如果我内部基于主键/外键加入表,它会起作用。
这是我的疑问:
SELECT TOP (1000) BU.bu_name, RE.resource_name,
TED.[tedetail_invoiced_hours]*TED.[tedetail_invoiced_hours_rate] AS TOTAL,TED.[modified] //This is the date modified
FROM [GasLiteTCM].[dbo].[tblTimeEntryDetail], [GasLiteTCM].[dbo].[tblBU] as BU,[GasLiteTCM].[dbo].[tblResource]
INNER JOIN [GasLiteTCM].[dbo].[tblTimeEntryDetail] as TED ON TED.[tedetail_te_id] = TE.[te_id]
INNER JOIN [GasLiteTCM].[dbo].[tblTimeEntry] as TE ON TE.[te_resource_id] = RE.[resource_id]
INNER JOIN [GasLiteTCM].[dbo].[tblResource] as RE ON RE.[resource_businessunit_id] = BU.[bu_id]
WHERE TED.tedetail_invoiced_hours IS NOT NULL AND TED.tedetail_invoiced_hours>0
ORDER BY modified DESC;
这是错误:
消息4104,级别16,状态1,行5多部分标识符 " TE.te_id"无法受约束。 Msg 4104,Level 16,State 1,Line 7 The 多部分标识符" RE.resource_id"无法受约束。消息4104, 16级,状态1,行9多部分标识符" BU.bu_id"可以 不受约束。 Msg 209,Level 16,State 1,Line 13 Ambiguous column 姓名'已修改'。消息4104,级别16,状态1,行21多部分 标识符" TE.te_id"无法受约束。 Msg 4104,Level 16,State 1, 第23行多部分标识符" RE.resource_id"无法受约束。 消息4104,级别16,状态1,行25多部分标识符 " BU.bu_id"无法受约束。 Msg 209,Level 16,State 1,Line 29 不明确的列名称'已修改'。
我在这个论坛上看了很多解决方案,但找不到他们的答案。我感谢任何帮助/建议,因为我还在学习SQL。
答案 0 :(得分:2)
在创建错误原因之前,您已使用别名[TE]
。
INNER JOIN [GasLiteTCM].[dbo].[tblTimeEntryDetail] AS TED
ON TED.[tedetail_te_id] = TE.[te_id] -- used before it is created
INNER JOIN [GasLiteTCM].[dbo].[tblTimeEntry] AS TE -- Created here
此外,您将隐式和显式Joins
结合起来"RE.resource_id"
& "BU.bu_id"
错误
这是正确的方法
SELECT TOP (1000) BU.bu_name,
RE.resource_name,
TED.[tedetail_invoiced_hours] * TED.[tedetail_invoiced_hours_rate] AS TOTAL,
TED.[modified]
FROM [GasLiteTCM].[dbo].[tblBU] AS BU
INNER JOIN [GasLiteTCM].[dbo].[tblResource] AS RE
ON RE.[resource_businessunit_id] = BU.[bu_id]
INNER JOIN [GasLiteTCM].[dbo].[tblTimeEntry] AS TE
ON TE.[te_resource_id] = RE.[resource_id]
INNER JOIN [GasLiteTCM].[dbo].[tblTimeEntryDetail] AS TED
ON TED.[tedetail_te_id] = TE.[te_id]
WHERE TED.tedetail_invoiced_hours IS NOT NULL
AND TED.tedetail_invoiced_hours > 0
ORDER BY modified DESC;