2015-02-26 2 views
0

Допустим, у меня есть следующий запрос.Как дать таблице имя псевдонима только один раз в mysql

SELECT a.num Num , a.info infoA, 
    b.info infoB, 
    c.info infoC 
FROM tbl_1 a 
LEFT OUTER JOIN tbl_2 b USING (num) 
LEFT OUTER JOIN tbl_3 c USING (num) 
UNION 
SELECT b.num Num , a.info infoA, 
    b.info infoB, 
    c.info infoC 
FROM tbl_2 b 
LEFT OUTER JOIN tbl_1 a USING (num) 
LEFT OUTER JOIN tbl_3 c USING (num) 
UNION 
SELECT c.num Num , a.info infoA, 
    b.info infoB, 
    c.info infoC 
FROM tbl_3 c 
LEFT OUTER JOIN tbl_1 a USING (num) 
LEFT OUTER JOIN tbl_2 b USING (num) 

http://sqlfiddle.com/#!2/b0593f/12/0
Проблема заключается в том, что вместо имен таблиц tbl_1, tbl_2 и tbl_3 у меня есть внутренний SELECT, querys, например:

FROM (SELECT...) a 

Я хотел бы написать имена таблиц (tbl_1 , tbl_2, tbl_3) только один раз, поэтому мне не пришлось бы многократно переписывать мои внутренние запросы SELECT.
Я пытался сделать что-то вроде этого, но он дал мне ошибку sytax:

SELECT a.num Num , a.info infoA, 
    b.info infoB, 
    c.info infoC 
FROM (SELECT...) a 
LEFT OUTER JOIN b USING (num) 
LEFT OUTER JOIN c USING (num) 
UNION 
SELECT b.num Num , a.info infoA, 
    b.info infoB, 
    c.info infoC 
FROM (SELECT...) b 
LEFT OUTER JOIN a USING (num) 
LEFT OUTER JOIN c USING (num) 
UNION 
SELECT c.num Num , a.info infoA, 
    b.info infoB, 
    c.info infoC 
FROM (SELECT...) c 
LEFT OUTER JOIN a USING (num) 
LEFT OUTER JOIN b USING (num) 

Но когда я пишу код, как это работает.

SELECT a.num Num , a.info infoA, 
    b.info infoB, 
    c.info infoC 
FROM (SELECT...) a 
LEFT OUTER JOIN (SELECT...) b USING (num) 
LEFT OUTER JOIN (SELECT...) c USING (num) 
UNION 
SELECT b.num Num , a.info infoA, 
    b.info infoB, 
    c.info infoC 
FROM (SELECT...) b 
LEFT OUTER JOIN (SELECT...) a USING (num) 
LEFT OUTER JOIN (SELECT...) c USING (num) 
UNION 
SELECT c.num Num , a.info infoA, 
    b.info infoB, 
    c.info infoC 
FROM (SELECT...) c 
LEFT OUTER JOIN (SELECT...) a USING (num) 
LEFT OUTER JOIN (SELECT...) b USING (num) 
+0

КТР? Кстати, не связано, почему бы не UNION ALL? – jarlh

ответ

1

Я не думаю, что это будет работать в любой форме. Отдельные запросы объединяются только оператором UNION

Я бы рекомендовал использовать три разных вида для вашей конкретной проблемы. Учитывая, что вы можете создавать представления в базе данных.

+0

Я нашел лучшее решение для создания временных таблиц для заданных внутренних запросов –

+0

Временные таблицы - также хороший подход. Если вы используете их очень часто, создавайте представления, если не просто создаете временные таблицы и позволяете им удаляться в конце сеанса. – DKSan

0

Проверить это будет работать

select sub.num Num , sub.info infoA, sub.info infoB, sub.info infoC 
from (

SELECT a.num , a.info , b.info , c.info 
FROM tbl_1 a 
LEFT OUTER JOIN tbl_2 b USING (num) 
LEFT OUTER JOIN tbl_3 c USING (num) 
UNION 
SELECT b.num , a.info , b.info , c.info 
FROM tbl_2 b 
LEFT OUTER JOIN tbl_1 a USING (num) 
LEFT OUTER JOIN tbl_3 c USING (num) 
UNION 
SELECT c.num , a.info , b.info , c.info 
FROM tbl_3 c 
LEFT OUTER JOIN tbl_1 a USING (num) 
LEFT OUTER JOIN tbl_2 b USING (num))sub 
Смежные вопросы