Обходной путь для использования псевдонима в предложении where: oracle10g - PullRequest
0 голосов
/ 08 марта 2011

У меня такой запрос: select data.* from ((select table1.col1 as "a") union (select table2.col2 as "b")) data where 1 = 1

Как я могу добавить выражение where к этому, если я хочу фильтровать по столбцу "a"? Я понимаю, что не могу использовать псевдонимы, но как мне написать предложение where? Я попробовал:

select data.* 
from (
   select table1.col1 as "a"
   union 
   select table2.col2 as "b"
) 
data where 1 = 1 
 and data.a = 'someValue'

Также:

select data.* 
from (
   select table1.col1 as "a"
   union 
   select table2.col2 as "b"
) data 
where 1 = 1 
  and data.table1.col1 = 'someValue'

Оба дали ошибки

Ответы [ 2 ]

3 голосов
/ 08 марта 2011

В дополнение к тому, что правильно сказал 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'

Но это также отфильтровывает значения, которые приходят из таблицы2 и имеют в своем столбце «someValue».Я не уверен, что это то, что вы хотели.Если вы только хотите отфильтровать строки, пришедшие из таблицы1 и имеющие 'someValue' в столбце col1, то вам нужно поместить это условие в объединение:

select data.* 
from (
   select col1 as a
   from table1
   where col1 = 'someValue' 
   union 
   select col2
   from table2  
) data

Если вы уверены, что между таблицей 1 и таблицей 2 нет дубликатов, я рекомендую UNION ALL более UNION, так как это быстрее, чем

1 голос
/ 08 марта 2011

Для всех операций выбора в Oracle требуется предложение FROM:

select data.* 
  from ((select 1 as a FROM dual) union 
        (select 2 as b FROM dual)) DATA 
 where 1 = 1 
   and data.a = '1'

В моем примере подставьте имена таблиц для двойных (просто они использовались для базовой проверки синтаксиса и здравомыслия).если вам не нужен псевдоним в нижнем регистре, проще опустить двойные кавычки в ваших псевдонимах, чтобы избежать использования двойных кавычек везде, где вы ссылаетесь на псевдоним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...