为什么仅当我 SELECT FROM (SELECT) 时才会出现重复的列名错误

Why do I get a duplicate column name error only when I SELECT FROM (SELECT)

我认为这是我的一个非常基本的疏忽,但我有一个 SQL 查询可以正常工作。但是当我 SELECT 从那个结果 (SELECT FROM (SELECT)) 我收到 'duplicate column' 错误。当然,在我比较它们的两个表中存在重复的列名,但它们不会在初始结果中造成问题。例如:

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 时,出现错误:

    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

我只需要 SELECT 重复的列之一,即使我正在比较它们。由以下答案提供。

您的第一个查询 returns 四列:

  • tag_id
  • article_id
  • tag_id
  • tag

结果集中允许重复列名,但table中不允许重复列名 -- 或派生table、视图、CTE 或大多数子查询(EXISTS 子查询除外)。

希望您能看到副本。没有必要 select tag_id 两次,因为 JOIN 要求值相同。所以只有 select 三列:

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

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

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

如果 _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);

在您的第二个查询中,即子查询,您 selecting tag_id 两次。虽然它来自两个不同的表,但它可以计算出您正在 select 处理数据的原因。但是,当您 select 具有相同名称的列两次时,它会为您提供重复错误。以下是您 select 编辑不正确的列的方式 _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