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

Apply Same where clause to both sides of outer join with the same table structure

我正在对结构完全相同的两个 table 执行 outer join。我的 table 是 year1year2

在下面的示例中,两个 table 都有字段 fieldA

我从 嵌套 select 开始,以避免 Ambiguous column name 'fieldA'

出现问题

选项 1:太慢

  select * from (
     select * from year1 
     outer join year2
     on year1.fieldB= year2.fieldB) fullQuery
     where fieldA <> 'foo' 

然而这最终变得太慢了,所以我需要 'copy' 每个 table

的 where 子句

选项 2:快速,但我们的应用程序不在 where 子句中提供 table 前缀

  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

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

问题:

如何在不将 table 名称附加到 where 子句的每个条件的情况下避免 ambiguous column name

您可以尝试命名子查询来获得结果。

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

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

Please note that this is not the best solution, but considering your situation it should be a viable workaround.

您的 sql 中的 OUTER JOIN 处存在语法错误,您不能在 select 行中包含超过 1 个同名列subselect,我更正了这个。 不得不使用一种奇怪的解决方法来防止在 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'