【问题标题】:Why do I get a duplicate column name error only when I SELECT FROM (SELECT)为什么只有当我 SELECT FROM (SELECT) 时才会出现重复的列名错误
【发布时间】:2020-08-17 19:51:03
【问题描述】:

我想这对我来说是一个非常基本的疏忽,但我有一个运行良好的 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 FROM (SELECT) 而不是在初始查询中出现错误? 谢谢

解决办法:

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

我只需要选择一个重复的列,即使我正在比较它们。由下面的答案提供。

【问题讨论】:

  • 我只能认为我需要在初始查询中对重复的列名进行别名?
  • 在后一种情况下,您创建派生表,它遵循表语义。列名必须是唯一的。

标签: sql select nested derived-table


【解决方案1】:

在您是第二个查询(即子查询)中,您选择 tag_id 两次。虽然它来自两个不同的表,但它可以确定您选择数据的原因。但是当您选择两次具有相同名称的列时,它会为您提供重复的错误。以下是您选择不正确列的方式 _dia_tagsrel.tag_id、_dia_tagsrel.article_id、_dia_tags.tag_id、_dia_tags.tag 在使用子查询、merge、in 或 exists 子句时,避免多次使用相同的列名。

简单的连接不需要子查询,

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

【讨论】:

  • 谢谢,我现在意识到部分感谢@GordonLinoff 派生表无法区分重复项。所以我要么将它们关闭(因为我只需要它们进行比较),要么创建一个别名。
  • 没错,加文。您能否提供一个赞成票,以便其他人也可以提供帮助
【解决方案2】:

您的第一个查询返回四列:

  • 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

【讨论】:

  • 嗨,所以 - 如果不重命名初始列,将这些列作为别名返回是否有效?谢谢
  • 谢谢,我会将此标记为我的答案。我的印象是我需要选择我用来比较的列,所以我只是把它们排除在外。所以实际上我只需要从 2 列中进行选择 - article_id 和 tag 就可以了。
【解决方案3】:

您的子查询有两个tag_ids,那么数据库引擎如何决定您要使用哪一个。

所以,要么使用一个(加入要求tag_ids 相同)或重命名它:

如果_dia_tag 具有唯一的tags,那么您可以使用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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2019-04-22
    相关资源
    最近更新 更多