我在两个具有完全相同结构的表上执行outer join
。我的表格为year1
和year2
。
在下面的示例中,两个表都包含字段fieldA
我开始使用嵌套选择来避免Ambiguous column name 'fieldA'
select * from (
select * from year1
outer join year2
on year1.fieldB= year2.fieldB) fullQuery
where fieldA <> 'foo'
然而这最终太慢了,所以我需要'复制'每个表的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
?
答案 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
)
您可以使用视图而不是命名子查询。
请注意,这不是最好的解决方案,但考虑到你的 情况应该是一个可行的解决方法。