将 Same where 子句应用于具有相同 table 结构的外部连接的两侧
Apply Same where clause to both sides of outer join with the same table structure
我正在对结构完全相同的两个 table 执行 outer join
。我的 table 是 year1
和 year2
。
在下面的示例中,两个 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'
我正在对结构完全相同的两个 table 执行 outer join
。我的 table 是 year1
和 year2
。
在下面的示例中,两个 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'