除了DBCookie正确说的(我假设内部查询中缺少的只是一个复制和粘贴错误):
具有别名 data 的派生表仅具有单个列,该列由联合中第一个SELECT的列名确定 . 此列名为 "a" (不是 a ),因为引号现在区分大小写 .
如果您不坚持使用小写列名称,则只需忽略内部查询中的引号 .
select data.*
from (
select col1 as a
from table1
union
select col2 --- you can leave out the alias here it's useless.
from table2
)
WHERE data.a = 'someValue' -- I remove the 1=1 as it doesn't serve any purpose
如果您坚持在引号中使用别名,则必须在WHERE子句中使用它们:
WHERE data."a" = 'someValue'
但是这也将过滤掉来自table2的值并在其col2中具有'someValue' . 我不确定这是不是你想要的 . 如果你想要过滤掉来自table1的行并且在col1中有'someValue',那么你需要将这个条件放在union中:
select data.*
from (
select col1 as a
from table1
where col1 = 'someValue'
union
select col2
from table2
) data
如果您确定table1和table2之间没有重复项,我建议使用 UNION ALL 而不是 UNION ,因为它比它更快 .