sql - 左连接的替代方案

标签 sql sql-server excel excel-2007 ms-query

我需要使用 MS Query 在 Excel 2007 中显示一组固定管道的月费率,即使管道没有月费率,也必须以这种方式显示
 required output

我在 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 并给出以下结果
actual output

在此输出中,未显示当月没有费率的管道。因此,此代码不起作用。因此,我试图寻找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/

相关文章:

sql-server - 使用 Case When Exists 子句进行更新

sql - 创建函数返回: you do not have permission (SQL Server 2000)

mysql - SQL如何对给定范围的列进行分组并连接到其他表以计算与第一列相关的行

sql - SQL:检查约束取决于其他表

sql - Postgres : Group by on a column but query needs to return all columns in the table

c# - 将List中的值导出到excel

excel - VBA - 如果不满足其他子中的条件,如何退出主子

mysql - SQL 跨行检查

sql-server - 避免 SQL Server 上急切的假脱机操作的方法

excel - 如何计算一个单元格中特定单词的总数并使用 VBA 对其他单元格做同样的事情?