Почему я получаю ошибку с повторяющимся именем столбца, только когда ВЫБРАТЬ ИЗ (ВЫБРАТЬ) - PullRequest
0 голосов
/ 03 мая 2020

Я думаю, что это действительно базовый упущение с моей стороны, но у меня есть запрос SQL, который работает нормально. Но когда я ВЫБИРАЮ из этого результата (SELECT FROM (SELECT)), я получаю ошибку «дубликат столбца». Конечно, в двух таблицах есть повторяющиеся имена столбцов, где я их сравниваю, но они не вызывают проблемы в исходном результате. Например:

SELECT _dia_tagsrel.tag_id,_dia_tagsrel.article_id, _dia_tags.tag_id, _dia_tags.tag
FROM _dia_tagsrel
JOIN _dia_tags
ON _dia_tagsrel.tag_id = _dia_tags.tag_id

Работает нормально, но когда я пытаюсь выбрать из него, я получаю ошибку:

    SELECT DISTINCT tag FROM
(SELECT _dia_tagsrel.tag_id,_dia_tagsrel.article_id, _dia_tags.tag_id, _dia_tags.tag
    FROM _dia_tagsrel
    JOIN _dia_tags
    ON _dia_tagsrel.tag_id = _dia_tags.tag_id) a

Независимо от DISTINCT. Хорошо, я могу изменить имена столбцов, чтобы они были уникальными, но на самом деле вопрос - почему я получаю ошибку, когда ВЫБИРАЮСЬ ОТ (ВЫБРАТЬ), а не в исходном запросе? Спасибо

Решение:

SELECT DISTINCT tag_id, tag FROM (SELECT  _dia_tagsrel.tag_id, _dia_tagsrel.article_id,  _dia_tags.tag
FROM _dia_tagsrel
JOIN _dia_tags
ON _dia_tagsrel.tag_id = _dia_tags.tag_id) a

Мне нужно было выбрать только один из дубликатов столбцов, хотя я сравнивал оба из них. Предоставлено ответом ниже.

Ответы [ 3 ]

2 голосов
/ 03 мая 2020


Привет, Гэвин,

Во втором запросе, т. Е. Подзапросе, вы дважды выбираете tag_id. Хотя это из двух разных таблиц, это работает, когда вы выбираете данные. Но когда вы выбираете столбцы с одинаковыми именами дважды, это дает вам двойную ошибку. Ниже приведен способ выбора столбца, который является неправильным Избегайте использования одних и тех же имен столбцов несколько раз.

Простое объединение не требует подзапросов,

SELECT _dia_tagsrel.tag_id,_dia_tagsrel.article_id, _dia_tags.tag_id, _dia_tags.tag
FROM _dia_tagsrel
JOIN _dia_tags
ON _dia_tagsrel.tag_id = _dia_tags.tag_id

Дайте мне знать, если вы все еще в замешательстве

Спасибо

1 голос
/ 03 мая 2020

Ваш подзапрос имеет два tag_id s, так как механизм базы данных решает, какой из них вы хотите использовать.

Итак, либо используйте один (для объединения требуется tag_id s, чтобы быть одинаковым), либо переименуйте это:

Если _dia_tag имеет уникальные tag с, то вы можете использовать EXISTS вместо INNER JOIN:

SELECT t.tag
FROM _dia_tags t
WHERE EXISTS (SELECT 1 FROM _dia_tagsrel tr WHERE tr.tag_id = t.tag_id);
1 голос
/ 03 мая 2020

Ваш первый запрос возвращает четыре столбца:

  • tag_id
  • article_id
  • tag_id
  • tag

Повторяющиеся имена столбцов допускаются в результирующем наборе , но не допускаются в таблице - или производной таблице, представлении, CTE или большинстве подзапросов (исключение составляют EXISTS подзапросы).

Надеюсь, вы увидите дубликат. Нет необходимости выбирать tag_id дважды, потому что JOIN требует, чтобы значения были одинаковыми. Так что просто выберите три столбца:

SELECT tr.tag_id, tr.article_id, t.tag
FROM _dia_tagsrel tr JOIN
     _dia_tags t
     ON tr.tag_id = t.tag_id
...