Синтаксическая ошибка с псевдонимами в подзапросах PostgreSQL - PullRequest
0 голосов
/ 08 декабря 2011

Я новичок в SQL и пытаюсь выполнить определенный запрос, в котором мне нужно два подзапроса.Я должен дать им псевдонимы, но когда я делаю это, он говорит:

ERROR:  syntax error at or near "as"

Но я не вижу ничего плохого в синтаксисе.У меня много проблем с такого рода запросами, и я не нахожу много информации или примеров.Не могли бы вы помочь мне?

Select
    ...
from
    turno,
    (select * from
        (
            select 
                ...
             from 
                accion
            where
                accion.tipo = 4 or accion.tipo = 5
        ) as part1
        union
        (
            select 
                ...
             from 
                accion
            where
                accion.tipo <> 4 and accion.tipo <> 5
        ) as part2
    ) as accion
where 
    ...
;

Большое спасибо.

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

У вас есть больше уровней запросов, чем необходимо, и перепутайте их. Попробуйте:

SELECT ...
FROM   turno,
      ( 
    SELECT ...
    FROM   accion
    WHERE  accion.tipo = 4 OR accion.tipo = 5

    UNION
    SELECT ...
    FROM   accion
    WHERE  accion.tipo <> 4 AND accion.tipo <> 5
   ) AS accion
WHERE ...

Лучше:

SELECT ...
FROM   turno
JOIN   (    
    SELECT ...
    FROM   accion
    WHERE  accion.tipo = 4 OR accion.tipo = 5

    UNION
    SELECT ...
    FROM   accion
    WHERE  accion.tipo <> 4 AND accion.tipo <> 5
   ) AS accion ON <join condition>
WHERE ...

Еще лучше, упростить до:

SELECT ...
FROM   turno
JOIN   (    
    SELECT ...
    FROM   accion
    WHERE  accion.tipo  = 4
       OR  accion.tipo  = 5
       OR (accion.tipo <> 4 AND accion.tipo <> 5)
   ) AS accion ON <join condition>
WHERE ...

Дает тот же результат, только быстрее и проще.

Условия определяют все строки (кроме a.tipo IS NULL) в accion. Так что в данном конкретном случае вы можете еще больше упростить:

SELECT ...
FROM   turno
JOIN   accion a ON a.tipo IS NOT NULL AND <join condition>
WHERE  ...

Но это, вероятно, из-за чрезмерного упрощения проблемы, верно?

Этот последний пример также демонстрирует, как ключевое слово AS является просто шумом в этом контексте.

1 голос
/ 08 декабря 2011

Попробуйте:

Select
    ...
from
    turno,
    (select * from
        (
            select 
                ...
             from 
                accion
            where
                accion.tipo = 4 or accion.tipo = 5
         union
            select 
                ...
             from 
                accion
            where
                accion.tipo <> 4 and accion.tipo <> 5
        ) as part1_2
    ) as accion
where 
    ...
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...