【发布时间】: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 - 我认为我只是缺少某种连接两个子查询的方法,或者我应该嵌套这些而不是......哦,我也不知道,呵呵。我知道我很接近——我只是不知道现在如何让这些人一起工作。它们分开工作,但我希望它们在一个查询中一起运行。