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