【发布时间】:2015-12-04 21:54:31
【问题描述】:
我正在两个具有完全相同结构的表上执行outer join。我的表是year1 和year2。
在下面的示例中,两个表都有字段fieldA
我从嵌套选择开始,以避免Ambiguous column name 'fieldA'出现问题
选项1:太慢了
select * from (
select * from year1
outer join year2
on year1.fieldB= year2.fieldB) fullQuery
where fieldA <> 'foo'
但是这最终太慢了,所以我需要“复制”每个表的 where 子句
选项 2:快,但我们的应用程序在 where 子句中没有提供表前缀
select * from year1
outer join year2
on year1.fieldB= year2.fieldB
where year1.fieldA <> 'foo' and year2.fieldA <> 'foo'
--where clause duplicated for the tables
不幸的是,我们的应用程序生成了一个没有表前缀的长 where 子句,尝试在应用程序中进行字符串操作以插入它们会很麻烦
问题:
如果不将表名附加到 where 子句的每个条件,如何避免 ambiguous column name?
【问题讨论】:
-
不幸的是,如果没有表名,您将无法避免 TSQL 中的错误。您可以为每一年创建一个视图,并为视图中的列添加前缀(第 1 年视图中的 ID 为 year1_id),然后加入视图。另一种选择是创建动态查询,具体取决于您的应用程序正在做什么以及您对其拥有多少控制权,但如果您无法控制应用程序输入,则会存在风险。
-
根据需要创建一个 VIEW,并从应用程序中引用它。
-
您可以查看同义词 (msdn.microsoft.com/en-gb/library/ms187552.aspx)。虽然我认为上面的 VIEW 建议是一个更好的方法。
标签: sql-server outer-join