为什么仅当我 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_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);
在您的第二个查询中,即子查询,您 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
我认为这是我的一个非常基本的疏忽,但我有一个 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_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);
在您的第二个查询中,即子查询,您 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