mysql - Duplicate Column Name 错误 MySQL 多个子查询

标签 mysql join subquery

更新:

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

表定义:

-- 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 天的试错)。看起来我的解决方案不涉及使用多个子查询,而是采用我的两个子查询并编写一个大的长子查询。如果有更优雅/更有效/更好的方法来做到这一点,我会很乐意不回答我的问题并将答案标记给其他人!

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

关于mysql - Duplicate Column Name 错误 MySQL 多个子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35294611/

相关文章:

php - 我无法显示 JOIN 查询的结果

php - 计算整个类别的销售额

仅当最新 ID 也与字符串 (location_is) 匹配时,MySQL 才会抓取行

sql - 了解 SQL 中的 JOIN 的好方法或教程

MySQL,优化子查询

MYSQL-无法更新存储函数/触发器中的表,因为它已被调用此存储函数/触发器的语句使用

sql - SQL中的异或联接

php - Mysql 日期范围查询返回错误的结果集

sql - MySQL EXPLAIN 类型 :ALL problem

mysql - 使用 Zend Framework 2 中的多个 SubSelect 生成查询