Псевдоним SQL объединяемых таблиц - PullRequest
5 голосов
/ 01 ноября 2010

У меня такой запрос:

select a1.name, b1.info 
 from (select name, id, status 
         from table1 a) as a1
right outer join (select id, info 
                    from table2 b) as b1 on (a1.id = b1.id)

Я хочу включить все, где a1.status = 1, и поскольку я использую внешнее соединение, я не могу просто добавить ограничение where к table1, потому что всю информацию из таблицы2, которую я хочу исключить все еще будет там, просто без имени. Я думал что-то вроде этого:

 select z1.name, z1.info 
   from ((select name, id, status 
            from table1 a) as a1
right outer join (select id, info 
                    from table2 b) as b1 on (a1.id = b1.id)) as z1 
  where z1.status = 1

но я не думаю, что это законно.

EDIT: Как описано ниже, внешнее соединение на самом деле не имеет смысла для того, что я пытаюсь сделать. Что, если, например, мне нужны все данные из таблицы 2, где статус! = 1 в таблице 1, включая все данные, в которых соответствующий идентификатор вообще не существует в таблице 1. Таким образом, мне нужно было бы внешнее объединение всех данных из таблицы 2, но все же нужно исключить те записи, где статус = 1.

Эквивалент этому:

 select z1.name, z1.info 
   from ((select name, id, status 
            from table1 a) as a1
right outer join (select id, info 
                    from table2 b) as b1 on (a1.id = b1.id)) as z1 
  where z1.status != 1

Ответы [ 3 ]

12 голосов
/ 01 ноября 2010
SELECT a1.Name, b1.Info
FROM table2 b1
    JOIN table2 a1 ON b1.id= a1.id AND a1.status = 1

Правое внешнее объединение делает то же самое, что и левое внешнее объединение, только с переключенными таблицами. Вы можете отфильтровать соединение, и оно все равно будет содержать данные из исходной таблицы.

2 голосов
/ 01 ноября 2010

Добавьте предложение where к subquery следующим образом:

select a1.name, b1.info from
(
    select name, id
    from table1 a  
    where a.status = 1
) as a1

right outer join

(
    select id, info 
    from table2 b
) as b1 on (a1.id=b1.id)
0 голосов
/ 01 ноября 2010
select a1.name, b1.info from
(select name, id, status from table1 a WHERE status=1) as a1
right outer join
(select id, info from table2 b) as b1 on (a1.id=b1.id)

РЕДАКТИРОВАТЬ:

Для вашего второго сценария:

select a1.name, b1.info from
(select name, id, status from table1 a) as a1
right outer join
(select id, info from table2 b) as b1 on (a1.id=b1.id)
EXCEPT
select a1.name, b1.info from
(select name, id, status from table1 a WHERE status<>1) as a1
right outer join
(select id, info from table2 b) as b1 on (a1.id=b1.id)

Это должно работать, так как вы получите все данные таблицы2 независимо от.

РЕДАКТИРОВАТЬ 2:

ОК, чтобы получить все из таблицы 2, ЗА ИСКЛЮЧЕНИЕМ, где в таблице 1 есть идентификатор статуса, даже если в таблице нет записи, вам нужно использовать функцию EXCEPT, которая в основном исключит подмножествоиз большего набора данных.

...