【问题标题】:Stored procedure joins存储过程连接
【发布时间】:2023-03-09 03:55:01
【问题描述】:

我刚刚在我的存储过程中添加了一个临时表,我正在尝试将此表连接到此存储过程中的其他字段。此更改会影响我的包的运行方式。所以程序运行正常,但我的包给了我一个错误'删除外部列'示例

If object_id() is null
Begin
Create table #...
Insert into table #...
(
Value int
Name varchar
)

Select value from # where .....

End

这运行正常,但我认为我的问题来自以下连接

Select ab.value, * from
(

Select top 100
...
...
...
...

Case when this then this 
Else null
End as usage

From ...
Left join ...
On 
Left join..
On
Left join
On 

)cd

Left join #.. ab on
ab. =  cd.

结果将我原来的存储过程(即括号中的 cd 表)连接到创建的临时表并带回空字段。这不是我想要的。右连接也不起作用。我可以将此添加为案例陈述吗?

我只希望临时表中的“值”字段作为结果中的一个字段。我希望能够在我的 ssis 包中映射它。

【问题讨论】:

  • 如果你的外连接返回表 ab 的所有空值,那么它没有找到匹配的记录。你确定你匹配的那一列在 AB 和 CD 中是一样的吗?
  • 它们不一样。除了其他字段之外,我只想从临时表中返回字段“值”。
  • 那么我假设临时表只有一行?然后,您可能想查看常规变量而不是临时表。您需要删除连接的连接部分,然后它将为 CD 中的每个返回 AB 中的行。但是,笛卡尔积查询是非常糟糕的做法,它们会占用处理时间。
  • 请您进一步解释一下...?要删除左连接并创建常规变量而不是临时表?

标签: sql sql-server stored-procedures sql-server-2008-r2 integration


【解决方案1】:

如果您的临时表只有一行,则应该这样做

declare @whatever varchar(10);
set @whatever = 'Foo'

select @whatever, A.* from table_A as A

如果您的临时表有不止一行,那么您正在做一个笛卡尔积(它将表 A 中的每一行与表 B 中的所有行匹配。这是一件非常糟糕的事情!

Select * from table_A, table_B  (make no comparison statement)

如果你这样做,它会杀死你的系统。例如,我对两个小表(439 行和 193 行)执行此操作,结果集超过 47,000 条记录!这很糟糕,很糟糕,很糟糕。

我有没有提到这是一件可怕的事情?

【讨论】:

  • 谢谢。我在原始存储过程中使用 case 语句对数据进行了硬编码(我删除了临时表和连接),它运行良好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
  • 2011-12-07
  • 2020-05-29
  • 1970-01-01
相关资源
最近更新 更多