SQL ОБЪЕДИНЕНИЕ двух запросов, ошибка дублирования имени столбца

#sql #duplicates #union

#sql #дубликаты #объединение

Вопрос:

Мне нужно 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)
  

Ответ №1:

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

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

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

Комментарии:

1. «вы не можете использовать два столбца с одинаковым именем» — действительно? Тогда следующий синтаксис не является допустимым? SELECT SNO, SNO FROM S UNION SELECT SNO, SNO FROM S; ?? Мне кажется, что это законный синтаксис SQL для дублирования имен столбцов в a UNION . Или я неправильно истолковал, что вы подразумеваете под «не может быть, чтобы два столбца использовали одно и то же имя»?

2. Извините, я должен был быть более ясным (я обновлю свой ответ). Проблема в том, что он помещает эти столбцы в подзапрос.

Ответ №2:

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

     (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)