SQL UNION из двух запросов, ошибка имени повторяющегося столбца - PullRequest
3 голосов
/ 05 октября 2011

Мне нужно UNION из двух запросов, каждый из которых работает отдельно, но не вместе, я получаю сообщение об ошибке: дублирующее имя столбца zipcode_id, пожалуйста, помогите.

(SELECT * FROM
    ( (SELECT * FROM jobs AS j LEFT JOIN zipcode AS z ON z.zipcode_id=j.zipcode_id WHERE 1 AND source='student'
              ORDER BY postdate DESC LIMIT 20) ORDER BY search_order DESC ) 
s1)
    UNION ALL
(SELECT * FROM
        (  (SELECT * FROM jobs AS j LEFT JOIN zipcode AS z ON z.zipcode_id=j.zipcode_id WHERE 1 AND source='manager'
               ORDER BY postdate DESC LIMIT 30, 1000000) ORDER BY postdate DESC )
s2)

Ответы [ 2 ]

4 голосов
/ 05 октября 2011

Если вы на самом деле используете SELECT *, тогда столбец zipcode_id находится как в таблице Jobs, так и в таблице Zipcode. Как говорится в сообщении об ошибке, вы не можете использовать два столбца с одинаковым именем. Поскольку вы используете подзапросы, у механизма SQL не будет возможности понять, что вы имеете в виду, если сослаться на дублированное имя столбца. Например, что должен возвращать следующий SQL-запрос?

SELECT num FROM (SELECT 1 AS num, 2 AS num) AS SQ

Использование SELECT * - довольно плохая практика в любом случае.

3 голосов
/ 05 октября 2011

Возможно, вам придется использовать разные псевдонимы для каждого подзапроса.Это должно работать:

    (SELECT * FROM
    ( (SELECT j1.* FROM jobs AS j1 LEFT JOIN zipcode AS z1 ON z1.zipcode_id=j1.zipcode_id WHERE 1 AND source='student'
              ORDER BY postdate DESC LIMIT 20) ORDER BY search_order DESC ) s1) UNION ALL
(SELECT * FROM
        (  (SELECT j2.* FROM jobs AS j2 LEFT JOIN zipcode AS z2 ON z2.zipcode_id=j2.zipcode_id WHERE 1 AND source='manager'
               ORDER BY postdate DESC LIMIT 30, 1000000) ORDER BY postdate DESC )
s2)
...