我需要使用 MS Query 在 Excel 2007 中显示一组固定管道的月费率,即使管道没有月费率,也必须以这种方式显示
我在 SQL Server 2008 R2 中使用以下代码完成了它。
SELECT P.Name AS [Pipeline Name],
PR.Id,
PR.[Name],
PH.[Value] AS Rate
FROM [GAS].[dbo].[Pipelinerate] PR
INNER JOIN Pipeline P
ON P.Id = PR.Pipelineid
LEFT OUTER JOIN [GAS].[dbo].[Pipelineratehistory] PH
ON PH.[Pipelinerateid] = PR.[Id]
AND ( PH.[Month] = ? --Month
AND PH.[Year] = ? ) --Year
WHERE ( PR.[Id] IN ( 197, 198, 1, 2, 3, 5, 67, 68, 23 ) )
AND ISNULL(PH.Deprecated, 'n') <> 'Y'
ORDER BY [Pipeline name],
PR.[Name]
当我尝试在 Excel 2007 的 MS Query 中执行此操作时,我得到以下错误[Microsoft][ODBC SQL Server Driver] Invalid Parameter Number
[Microsoft][ODBC SQL Server Driver] Invalid Descriptor Index
我通过跟踪和错误发现如果我从 ON
中删除带有参数的条件子句并将其放入 WHERE Clause
如下SELECT P.Name AS [Pipeline Name],
PR.Id,
PR.[Name],
PH.[Value] AS Rate
FROM [GAS].[dbo].[Pipelinerate] PR
INNER JOIN Pipeline P
ON P.Id = PR.Pipelineid
LEFT OUTER JOIN [GAS].[dbo].[Pipelineratehistory] PH
ON PH.[Pipelinerateid] = PR.[Id]
WHERE ( PR.[Id] IN ( 197, 198, 1, 2, 3, 5, 67, 68, 23 ) )
AND ( PH.[Month] = ? --Month
AND PH.[Year] = ? ) --Year
AND ISNULL(PH.Deprecated, 'n') <> 'Y'
ORDER BY [Pipeline name],
PR.[Name]
该代码适用于 MS Query 并给出以下结果在此输出中,未显示当月没有费率的管道。因此,此代码不起作用。因此,我试图寻找
LEFT JOIN
的替代品。在这种情况下,使用 MS Query 在 excel 中获得所需的输出。协会
Pipeline 和 PipelineRate - 可选的一对多关系
PipelineRate 和 PipelineRateHistory - 可选的一对多关系
任何人都可以建议左加入的替代方法或实现此目的的方法吗?
PS:我不能使用存储过程。我知道如何使用 VBA 来做到这一点。我需要使用 MS Query 来完成此操作
最佳答案
尝试:
SELECT P.Name AS [Pipeline Name],
PR.Id,
PR.[Name],
PH.[Value] AS Rate
FROM [GAS].[dbo].[Pipelinerate] PR
INNER JOIN Pipeline P
ON P.Id = PR.Pipelineid
LEFT OUTER JOIN [GAS].[dbo].[Pipelineratehistory] PH
ON PH.[Pipelinerateid] = PR.[Id]
AND PH.[Month] = ? --Month
AND PH.[Year] = ? --Year
WHERE ( PR.[Id] IN ( 197, 198, 1, 2, 3, 5, 67, 68, 23 ) )
AND ISNULL(PH.Deprecated, 'n') <> 'Y'
ORDER BY [Pipeline name],
PR.[Name]
我所做的只是删除了一些不必要的括号。显然Excel有一个错误。解决方法之一是将其转换为存储过程并从 Excel 调用存储过程。从阅读来看,参数的确定和编号方式可能存在问题。
关于sql - 左连接的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16846915/