【问题标题】:Duplicate Column Name error MySQL multiple subqueriesDuplicate Column Name 错误 MySQL 多个子查询
【发布时间】:2016-02-09 14:31:19
【问题描述】:

更新:

这是我的新查询 - 我认为这是正确的,但我收到一条错误消息说 Duplicate column name 'PART_KIT_ID' --- 这两个子查询几乎相同,只是连接不同......有什么想法吗?

SELECT * FROM (SELECT a.PART_KIT_ID `PART_KIT_ID`
, CASE WHEN b.EQUIP_MDL_ID <> c.EQUIP_MDL_ID and b.EQUIP_MDL_ID <> a.EQUIP_MDL_ID THEN 'EQUIP_MDL_ID FLAG A' ELSE NULL END AS `Flag NameA`
, CASE WHEN b.EQUIP_MDL_ID = c.EQUIP_MDL_ID and b.EQUIP_MDL_ID <> a.EQUIP_MDL_ID THEN 'EQUIP_MDL_ID FLAG B' ELSE NULL END AS `Flag NameB`
, a.PART_KIT_NAME `PART_KIT_NAME`
, a.EQUIP_MDL `EQUIP_MDL`
, a.EXTERNAL_SYS_PART_ID `EXTERNAL_SYS_PART_ID`
, d.PART_KIT_DESC `PART_KIT_DESC`
FROM cost_equip_mdl_part_ctlg_acat a
JOIN cost_equip_mdl_part_ctlg_icam b ON a.EXTERNAL_SYS_PART_ID = b.EXTERNAL_SYS_PART_ID  and a.EQUIP_MDL_ID = b.EQUIP_MDL_ID
JOIN cost_equip_mdl_part_ctlg_icam_prior c on a.EXTERNAL_SYS_PART_ID = c.EXTERNAL_SYS_PART_ID and a.PART_KIT_ID = c.PART_KIT_ID and a.EQUIP_MDL_ID = c.EQUIP_MDL_ID 
LEFT OUTER JOIN acat_attribute d on a.EXTERNAL_SYS_PART_ID = d.EXTERNAL_SYS_PART_ID and a.PART_KIT_ID = d.PART_KIT_ID
UNION ALL
SELECT a.PART_KIT_ID `PART_KIT_ID`
, CASE WHEN b.SECTION_ID <> c.SECTION_ID and b.SECTION_ID <> a.SECTION_ID THEN 'SECTION_ID FLAGA' ELSE NULL END AS `Flag NameA`
, CASE WHEN b.SECTION_ID = c.SECTION_ID and b.SECTION_ID <> a.SECTION_ID THEN 'SECTION_ID FLAGB' ELSE NULL END AS `Flag NameB`
, a.PART_KIT_NAME `PART_KIT_NAME`
, a.EQUIP_MDL `EQUIP_MDL`
, a.EXTERNAL_SYS_PART_ID `EXTERNAL_SYS_PART_ID`
, d.PART_KIT_DESC `PART_KIT_DESC`
 FROM cost_equip_mdl_part_ctlg_acat a
 JOIN cost_equip_mdl_part_ctlg_icam b ON a.EXTERNAL_SYS_PART_ID = b.EXTERNAL_SYS_PART_ID and a.PART_KIT_ID = b.PART_KIT_ID and a.EQUIP_MDL_ID = b.EQUIP_MDL_ID
 JOIN cost_equip_mdl_part_ctlg_icam_prior c on a.EXTERNAL_SYS_PART_ID = c.EXTERNAL_SYS_PART_ID and a.PART_KIT_ID = c.PART_KIT_ID and a.EQUIP_MDL_ID = c.EQUIP_MDL_ID 
 LEFT OUTER JOIN acat_attribute d on a.EXTERNAL_SYS_PART_ID = d.EXTERNAL_SYS_PART_ID and a.PART_KIT_ID = d.PART_KIT_ID 
  ) A ,
   (SELECT a.PART_KIT_ID `PART_KIT_ID`
   , CASE WHEN a.EQUIP_MDL_ID <> c.EQUIP_MDL_ID THEN 'EQUIP_MDL_ID INSERTFLAG' ELSE NULL END AS `Flag NameA`
   , a.PART_KIT_NAME `PART_KIT_NAME`
   , a.EQUIP_MDL `EQUIP_MDL`
   , a.EXTERNAL_SYS_PART_ID `EXTERNAL_SYS_PART_ID`
   , d.PART_KIT_DESC `PART_KIT_DESC`
   FROM cost_equip_mdl_part_ctlg_acat a
   JOIN cost_equip_mdl_part_ctlg_icam_prior c on a.EXTERNAL_SYS_PART_ID = c.EXTERNAL_SYS_PART_ID and a.EQUIP_MDL_ID = c.EQUIP_MDL_ID 
   LEFT OUTER JOIN acat_attribute d on a.EXTERNAL_SYS_PART_ID = d.EXTERNAL_SYS_PART_ID
   UNION ALL
   SELECT a.PART_KIT_ID `PART_KIT_ID`
   , CASE WHEN a.SECTION_ID <> c.SECTION_ID THEN 'SECTION_ID INSERTFLAG' ELSE NULL END AS `Flag NameA`
   , a.PART_KIT_NAME `PART_KIT_NAME`
   , a.EQUIP_MDL `EQUIP_MDL`
   , a.EXTERNAL_SYS_PART_ID `EXTERNAL_SYS_PART_ID`
   , d.PART_KIT_DESC `PART_KIT_DESC`
   FROM cost_equip_mdl_part_ctlg_acat a
   JOIN cost_equip_mdl_part_ctlg_icam_prior c on a.EXTERNAL_SYS_PART_ID = c.EXTERNAL_SYS_PART_ID and a.EQUIP_MDL_ID = c.EQUIP_MDL_ID 
   LEFT OUTER JOIN acat_attribute d on a.EXTERNAL_SYS_PART_ID = d.EXTERNAL_SYS_PART_ID
   WHERE a.PART_KIT_ID IS NULL
   ) B

原始问题 - 如何将这两个查询合并为一个?

查询一个

SELECT a.PART_KIT_ID, `PART_KIT_NAME`, `EQUIP_MDL`, `EXTERNAL_SYS_PART_ID`, `PART_KIT_DESC`, `Flag NameA`, `Flag NameB`
from (SELECT a.PART_KIT_ID `PART_KIT_ID`
, CASE WHEN b.EQUIP_MDL_ID <> c.EQUIP_MDL_ID and b.EQUIP_MDL_ID <> a.EQUIP_MDL_ID THEN 'EQUIP_MDL_ID FLAG A' ELSE NULL END AS `Flag NameA`
, CASE WHEN b.EQUIP_MDL_ID = c.EQUIP_MDL_ID and b.EQUIP_MDL_ID <> a.EQUIP_MDL_ID THEN 'EQUIP_MDL_ID FLAG B' ELSE NULL END AS `Flag NameB`
, a.PART_KIT_NAME `PART_KIT_NAME`
, a.EQUIP_MDL `EQUIP_MDL`
, a.EXTERNAL_SYS_PART_ID `EXTERNAL_SYS_PART_ID`
, d.PART_KIT_DESC `PART_KIT_DESC`
FROM cost_equip_mdl_part_ctlg_acat a
JOIN cost_equip_mdl_part_ctlg_icam b ON a.EXTERNAL_SYS_PART_ID = b.EXTERNAL_SYS_PART_ID  and a.EQUIP_MDL_ID = b.EQUIP_MDL_ID
JOIN cost_equip_mdl_part_ctlg_icam_prior c on a.EXTERNAL_SYS_PART_ID = c.EXTERNAL_SYS_PART_ID and a.PART_KIT_ID = c.PART_KIT_ID and a.EQUIP_MDL_ID = c.EQUIP_MDL_ID 
LEFT OUTER JOIN acat_attribute d on a.EXTERNAL_SYS_PART_ID = d.EXTERNAL_SYS_PART_ID and a.PART_KIT_ID = d.PART_KIT_ID
UNION ALL
SELECT a.PART_KIT_ID `PART_KIT_ID`
, CASE WHEN b.SECTION_ID <> c.SECTION_ID and b.SECTION_ID <> a.SECTION_ID THEN 'SECTION_ID FLAGA' ELSE NULL END AS `Flag NameA`
, CASE WHEN b.SECTION_ID = c.SECTION_ID and b.SECTION_ID <> a.SECTION_ID THEN 'SECTION_ID FLAGB' ELSE NULL END AS `Flag NameB`
, a.PART_KIT_NAME `PART_KIT_NAME`
, a.EQUIP_MDL `EQUIP_MDL`
, a.EXTERNAL_SYS_PART_ID `EXTERNAL_SYS_PART_ID`
, d.PART_KIT_DESC `PART_KIT_DESC`
FROM cost_equip_mdl_part_ctlg_acat a
JOIN cost_equip_mdl_part_ctlg_icam b ON a.EXTERNAL_SYS_PART_ID = b.EXTERNAL_SYS_PART_ID and a.PART_KIT_ID = b.PART_KIT_ID and a.EQUIP_MDL_ID = b.EQUIP_MDL_ID
JOIN cost_equip_mdl_part_ctlg_icam_prior c on a.EXTERNAL_SYS_PART_ID = c.EXTERNAL_SYS_PART_ID and a.PART_KIT_ID = c.PART_KIT_ID and a.EQUIP_MDL_ID = c.EQUIP_MDL_ID 
LEFT OUTER JOIN acat_attribute d on a.EXTERNAL_SYS_PART_ID = d.EXTERNAL_SYS_PART_ID and a.PART_KIT_ID = d.PART_KIT_ID 
) a

查询 B

SELECT b.PART_KIT_ID, `PART_KIT_NAME`, `EQUIP_MDL`, `EXTERNAL_SYS_PART_ID`, `PART_KIT_DESC`, `Flag NameA`, `Flag NameB`
FROM (SELECT c.PART_KIT_ID `PART_KIT_ID`
, CASE WHEN a.EQUIP_MDL_ID <> c.EQUIP_MDL_ID THEN 'EQUIP_MDL_ID INSERTFLAG' ELSE NULL END AS `Flag NameA`
, a.PART_KIT_NAME `PART_KIT_NAME`
, a.EQUIP_MDL `EQUIP_MDL`
, a.EXTERNAL_SYS_PART_ID `EXTERNAL_SYS_PART_ID`
, d.PART_KIT_DESC `PART_KIT_DESC`
FROM cost_equip_mdl_part_ctlg_acat a
JOIN cost_equip_mdl_part_ctlg_icam_prior c on a.EXTERNAL_SYS_PART_ID = c.EXTERNAL_SYS_PART_ID and a.EQUIP_MDL_ID = c.EQUIP_MDL_ID 
LEFT OUTER JOIN acat_attribute d on a.EXTERNAL_SYS_PART_ID = d.EXTERNAL_SYS_PART_ID
UNION ALL
SELECT c.PART_KIT_ID `PART_KIT_ID`
, CASE WHEN a.SECTION_ID <> c.SECTION_ID THEN 'SECTION_ID INSERTFLAG' ELSE NULL END AS `Flag NameA`
, a.PART_KIT_NAME `PART_KIT_NAME`
, a.EQUIP_MDL `EQUIP_MDL`
, a.EXTERNAL_SYS_PART_ID `EXTERNAL_SYS_PART_ID`
, d.PART_KIT_DESC `PART_KIT_DESC`
FROM cost_equip_mdl_part_ctlg_acat a
JOIN cost_equip_mdl_part_ctlg_icam_prior c on a.EXTERNAL_SYS_PART_ID = c.EXTERNAL_SYS_PART_ID and a.EQUIP_MDL_ID = c.EQUIP_MDL_ID 
LEFT OUTER JOIN acat_attribute d on a.EXTERNAL_SYS_PART_ID = d.EXTERNAL_SYS_PART_ID
WHERE a.PART_KIT_ID IS NULL
) b

表定义:

-- 脚本由 Devart dbForge Studio for MySQL 生成,版本 6.3.358.0 -- 产品主页:http://www.devart.com/dbforge/mysql/studio -- 脚本日期 2/9/2016 10:32:41 AM -- 服务器版本:5.6.21

-- 客户端版本:4.1

USE test_kg;

CREATE TABLE cost_equip_mdl_part_ctlg_acat (
CTLG_VER_ID varchar(255) DEFAULT NULL,
CTLG_NAME varchar(255) DEFAULT NULL,
EQUIP_MDL_ID varchar(255) DEFAULT NULL,
EQUIPMENT_TECHNOLOGY_ID varchar(255) DEFAULT NULL,
EQUIP_MDL varchar(255) DEFAULT NULL,
SECTION_ID varchar(255) DEFAULT NULL,
ACAT_SECTION_ID varchar(255) DEFAULT NULL,
SECTION_NAME varchar(255) DEFAULT NULL,
EXTERNAL_SYS_PART_ID varchar(255) DEFAULT NULL,
PART_KIT_ID varchar(255) DEFAULT NULL,
ACAT_PART_KIT_ID varchar(255) DEFAULT NULL,
MODULE_ID varchar(255) DEFAULT NULL,
MODULE_DRIVER_IND varchar(255) DEFAULT NULL,
PART_KIT_NAME varchar(255) DEFAULT NULL,
INDEX IDX_cost_equip_mdl_part_ctlg_acat (EXTERNAL_SYS_PART_ID, PART_KIT_ID,   EQUIP_MDL_ID)
 )
ENGINE = INNODB
AVG_ROW_LENGTH = 170
CHARACTER SET latin1
COLLATE latin1_swedish_ci;

CREATE TABLE cost_equip_mdl_part_ctlg_icam (
CTLG_VER_ID varchar(255) DEFAULT NULL,
CTLG_NAME varchar(255) DEFAULT NULL,
EQUIP_MDL_ID varchar(255) DEFAULT NULL,
EQUIP_MDL varchar(255) DEFAULT NULL,
SECTION_ID varchar(255) DEFAULT NULL,
SECTION_NAME varchar(255) DEFAULT NULL,
EXTERNAL_SYS_PART_ID varchar(255) DEFAULT NULL,
PART_KIT_ID varchar(255) DEFAULT NULL,
MODULE_ID varchar(255) DEFAULT NULL,
MODULE_DRIVER_IND varchar(255) DEFAULT NULL,
PART_KIT_NAME varchar(255) DEFAULT NULL,
UPDATED_DT varchar(255) DEFAULT NULL,
UPDATE_STATUS varchar(255) DEFAULT NULL,
INDEX IDX_cost_equip_mdl_part_ctlg_icam_prior (EXTERNAL_SYS_PART_ID, PART_KIT_ID, EQUIP_MDL_ID)
 )
ENGINE = INNODB
AVG_ROW_LENGTH = 170
CHARACTER SET latin1
COLLATE latin1_swedish_ci;

CREATE TABLE cost_equip_mdl_part_ctlg_icam_prior (
CTLG_VER_ID varchar(255) DEFAULT NULL,
CTLG_NAME varchar(255) DEFAULT NULL,
EQUIP_MDL_ID varchar(255) DEFAULT NULL,
EQUIP_MDL varchar(255) DEFAULT NULL,
SECTION_ID varchar(255) DEFAULT NULL,
SECTION_NAME varchar(255) DEFAULT NULL,
EXTERNAL_SYS_PART_ID varchar(255) DEFAULT NULL,
PART_KIT_ID varchar(255) DEFAULT NULL,
MODULE_ID varchar(255) DEFAULT NULL,
MODULE_DRIVER_IND varchar(255) DEFAULT NULL,
PART_KIT_NAME varchar(255) DEFAULT NULL,
UPDATED_DT varchar(255) DEFAULT NULL,
UPDATE_STATUS varchar(255) DEFAULT NULL,
INDEX IDX_cost_equip_mdl_part_ctlg_icam (EXTERNAL_SYS_PART_ID, PART_KIT_ID, EQUIP_MDL_ID)
  )
 ENGINE = INNODB
 AVG_ROW_LENGTH = 167
 CHARACTER SET latin1
 COLLATE latin1_swedish_ci;

【问题讨论】:

  • 表定义将有助于处理漂亮的查询:)
  • @Alfabravo - 抱歉,这里真的是一个新手 - 我在 dbForge Studio for MySQL 中完成了我的大部分数据库活动。如果我为 3 个表生成创建脚本,是否会提供表定义(因此,列名/详细信息、引擎、平均行长度、字符集等)?
  • 检查文档,为您的对象生成 DDL 的方法是here
  • 谢谢,添加了表定义:)
  • @Alfabravo - 我认为我只是缺少某种连接两个子查询的方法,或者我应该嵌套这些而不是......哦,我也不知道,呵呵。我知道我很接近——我只是不知道现在如何让这些人一起工作。它们分开工作,但我希望它们在一个查询中一起运行。

标签: mysql join subquery


【解决方案1】:

哎呀。那是子查询中的一些速成课程-在大多数情况下,我对此仍然完全绝望,并且在搜索了 3 天后才找到我的答案,哈哈哈(以及 3 天的反复试验)。看来我的解决方案不涉及使用多个子查询,而是使用我的两个子查询并编写一个大的长子查询。如果有更优雅/更高效/更好的方法来做这件事,我会很乐意回答我的问题并将答案复选标记给其他人!

SELECT a.PART_KIT_ID, `Flag NameA`, `Flag NameB`, `PART_KIT_NAME`, `EQUIP_MDL`, `EXTERNAL_SYS_PART_ID`, `PART_KIT_DESC`
from (SELECT c.PART_KIT_ID `PART_KIT_ID` 
, CASE WHEN b.EQUIP_MDL_ID <> c.EQUIP_MDL_ID and b.EQUIP_MDL_ID <> a.EQUIP_MDL_ID THEN 'EQUIP_MDL_ID FLAG A' ELSE NULL END AS `Flag NameA`
, CASE WHEN b.EQUIP_MDL_ID = c.EQUIP_MDL_ID and b.EQUIP_MDL_ID <> a.EQUIP_MDL_ID THEN 'EQUIP_MDL_ID FLAG B' ELSE NULL END AS `Flag NameB`
, a.PART_KIT_NAME `PART_KIT_NAME`
, a.EQUIP_MDL `EQUIP_MDL`
, a.EXTERNAL_SYS_PART_ID `EXTERNAL_SYS_PART_ID`
, d.PART_KIT_DESC `PART_KIT_DESC`
FROM cost_equip_mdl_part_ctlg_acat a
JOIN cost_equip_mdl_part_ctlg_icam b ON a.EXTERNAL_SYS_PART_ID = b.EXTERNAL_SYS_PART_ID  and a.EQUIP_MDL_ID = b.EQUIP_MDL_ID
JOIN cost_equip_mdl_part_ctlg_icam_prior c on a.EXTERNAL_SYS_PART_ID = c.EXTERNAL_SYS_PART_ID and a.PART_KIT_ID = c.PART_KIT_ID and a.EQUIP_MDL_ID = c.EQUIP_MDL_ID 
LEFT OUTER JOIN acat_attribute d on a.EXTERNAL_SYS_PART_ID = d.EXTERNAL_SYS_PART_ID and a.PART_KIT_ID = d.PART_KIT_ID
UNION ALL
SELECT c.PART_KIT_ID `PART_KIT_ID` 
, CASE WHEN a.EQUIP_MDL_ID <> c.EQUIP_MDL_ID THEN 'EQUIP_MDL_ID INSERTFLAG' ELSE NULL END AS `Flag NameA`
, NULL as `Flag NameB`
, a.PART_KIT_NAME `PART_KIT_NAME`
, a.EQUIP_MDL `EQUIP_MDL`
, a.EXTERNAL_SYS_PART_ID `EXTERNAL_SYS_PART_ID`
, d.PART_KIT_DESC `PART_KIT_DESC`
FROM cost_equip_mdl_part_ctlg_acat a
JOIN cost_equip_mdl_part_ctlg_icam_prior c on a.EXTERNAL_SYS_PART_ID = c.EXTERNAL_SYS_PART_ID and a.EQUIP_MDL_ID = c.EQUIP_MDL_ID 
LEFT OUTER JOIN acat_attribute d on a.EXTERNAL_SYS_PART_ID = d.EXTERNAL_SYS_PART_ID
UNION ALL
SELECT c.PART_KIT_ID `PART_KIT_ID` 
, CASE WHEN b.SECTION_ID <> c.SECTION_ID and b.SECTION_ID <> a.SECTION_ID THEN 'SECTION_ID FLAGA' ELSE NULL END AS `Flag NameA`
, CASE WHEN b.SECTION_ID = c.SECTION_ID and b.SECTION_ID <> a.SECTION_ID THEN 'SECTION_ID FLAGB' ELSE NULL END AS `Flag NameB`
, a.PART_KIT_NAME `PART_KIT_NAME`
, a.EQUIP_MDL `EQUIP_MDL`
, a.EXTERNAL_SYS_PART_ID `EXTERNAL_SYS_PART_ID`
, d.PART_KIT_DESC `PART_KIT_DESC`
FROM cost_equip_mdl_part_ctlg_acat a
JOIN cost_equip_mdl_part_ctlg_icam b ON a.EXTERNAL_SYS_PART_ID = b.EXTERNAL_SYS_PART_ID and a.PART_KIT_ID = b.PART_KIT_ID and a.EQUIP_MDL_ID = b.EQUIP_MDL_ID
JOIN cost_equip_mdl_part_ctlg_icam_prior c on a.EXTERNAL_SYS_PART_ID = c.EXTERNAL_SYS_PART_ID and a.PART_KIT_ID = c.PART_KIT_ID and a.EQUIP_MDL_ID = c.EQUIP_MDL_ID 
LEFT OUTER JOIN acat_attribute d on a.EXTERNAL_SYS_PART_ID = d.EXTERNAL_SYS_PART_ID and a.PART_KIT_ID = d.PART_KIT_ID
UNION ALL
SELECT c.PART_KIT_ID `PART_KIT_ID` 
, CASE WHEN a.SECTION_ID <> c.SECTION_ID THEN 'SECTION_ID INSERTFLAG' ELSE NULL END AS `Flag NameA`
, NULL as `Flag NameB`
, a.PART_KIT_NAME `PART_KIT_NAME`
, a.EQUIP_MDL `EQUIP_MDL`
, a.EXTERNAL_SYS_PART_ID `EXTERNAL_SYS_PART_ID`
, d.PART_KIT_DESC `PART_KIT_DESC`
FROM cost_equip_mdl_part_ctlg_acat a
JOIN cost_equip_mdl_part_ctlg_icam_prior c on a.EXTERNAL_SYS_PART_ID = c.EXTERNAL_SYS_PART_ID and a.EQUIP_MDL_ID = c.EQUIP_MDL_ID 
LEFT OUTER JOIN acat_attribute d on a.EXTERNAL_SYS_PART_ID = d.EXTERNAL_SYS_PART_ID
WHERE a.PART_KIT_ID IS NULL
) A

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-25
    • 2020-02-27
    • 2014-03-19
    • 2021-11-03
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多