将Same where子句应用于具有相同表结构的外连接的两侧

时间:2015-12-04 21:54:31

标签: sql-server outer-join

我在两个具有完全相同结构的表上执行outer join。我的表格为year1year2

在下面的示例中,两个表都包含字段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

不幸的是,我们的应用程序生成一个没有表前缀的long where子句,并且尝试在应用程序中进行字符串操作以插入它们会很麻烦

问题:

如果不将表名附加到where子句的每个条件,我如何避免ambiguous column name

2 个答案:

答案 0 :(得分:1)

您的SQL中 OUTER JOIN 有语法错误,您无法在子选择中选择具有多个同名列的行,我更正了此问题。 不得不使用一个奇怪的解决方法来防止在WHERE子句中使用前缀。这是查询:

SELECT *
FROM 
  year1
JOIN
  (SELECT 1 x) x -- this way rows where fieldA='foo' is eliminated
ON               -- without using the WHERE clause
  year1.fieldA <> 'foo'
LEFT JOIN -- outer join is incorrect syntax
  year2 
ON
  year1.fieldB= year2.fieldB
  and year2.fieldA <> 'foo'

答案 1 :(得分:0)

您可以尝试使用命名子查询来实现结果。

 SELECT * FROM (
        ( SELECT * FROM year1 where  fieldA <> 'foo' ) year1
        FULL OUTER JOIN 
        ( SELECT * FROM year2 where  fieldA <> 'foo' ) year2
        ON year1.fieldB= year2.fieldB
     )

您可以使用视图而不是命名子查询。

  

请注意,这不是最好的解决方案,但考虑到你的   情况应该是一个可行的解决方法。