#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 для дублирования имен столбцов в aUNION
. Или я неправильно истолковал, что вы подразумеваете под «не может быть, чтобы два столбца использовали одно и то же имя»?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)