重复列名错误 MySQL 多个子查询

Duplicate Column Name error MySQL multiple subqueries

更新:

这是我的新查询 - 我认为这写得正确,但我收到一条错误消息说 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

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

查询 A

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

Table 定义:

-- Script was generated by Devart dbForge Studio for MySQL, Version 6.3.358.0 -- Product home page: http://www.devart.com/dbforge/mysql/studio -- Script date 2/9/2016 10:32:41 AM -- Server version: 5.6.21

-- Client version: 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;

呸。那是子查询的一些速成班——在大多数情况下我仍然完全没有希望,并且在搜索 3 天后才找到我的答案,哈哈哈(以及 3 天的试错)。看起来我的解决方案不涉及使用多个子查询,而是采用我的两个子查询并编写一个大的长子查询。如果有更多 elegant/efficient/more 更好的方法来做到这一点,我会很乐意不回答我的问题并将答案标记给其他人!

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