Sql 转置的父/子表的行数不正确
我们每天都将工程数据加载到父/子表中。为了方便用户报告,我创建了一个视图,它将表格展平为单个表格布局 我在视图中获得的记录数(Sql 转置的父/子表的行数不正确,sql,Sql,我们每天都将工程数据加载到父/子表中。为了方便用户报告,我创建了一个视图,它将表格展平为单个表格布局 我在视图中获得的记录数(截至今天:250090)与父表中的记录数不匹配(截至今天:411269)。这是视图的代码: SEL CAST( A.END_TIME_TEXT AS TIMESTAMP(0) ) END_TIME, UPPER(A.OPER_NAME) OPER_NAME, CAST( A.START_TIME_TEXT A
截至今天:250090
)与父表中的记录数不匹配(截至今天:411269
)。这是视图的代码:
SEL
CAST( A.END_TIME_TEXT AS TIMESTAMP(0) ) END_TIME,
UPPER(A.OPER_NAME) OPER_NAME,
CAST( A.START_TIME_TEXT AS TIMESTAMP(0)) START_TIME,
UPPER(A.PROC_NAME) PROC_NAME ,
UPPER(A.PROC_REV_TEXT) PROC_REV_TEXT ,
A.LOC_1_NAME,
UPPER(A.LOC_1_TYPE_DESC) LOC_1_TYPE_DESC ,
UPPER(A.LOC_2_NAME) LOC_2_NAME,
UPPER(A.LOC_2_TYPE_DESC) LOC_2_TYPE_DESC,
A.LOC_3_NAME ,
UPPER(A.LOC_3_TYPE_DESC) LOC_3_TYPE_DESC,
A.LOC_4_NAME ,
UPPER(A.LOC_4_TYPE_DESC) LOC_4_TYPE_DESC ,
A.SER_NUM_TEXT ,
UPPER(A.PROD_REV_TEXT) PROD_REV_TEXT ,
UPPER(A.PROD_TYPE_DESC) PROD_TYPE_DESC,
UPPER(A.OUTCOME_TEXT ) OUTCOME_TEXT,
UPPER(A.DRIVER_PLAT_TEXT) DRIVER_PLAT_TEXT,-
CAST(A.DRIVER_REV_TEXT AS DECIMAL (1,0)) DRIVER_REV_TEXT ,
A.ENABLE_PARM_DB_COMM_TEXT ,
A.ENABLE_SFCS_COMM_TEXT ,
A.FORCE_PARM_DB_UPD_TEXT ,
B.BIST_FAIL_CODE, B.STB_CLIENT,
B.STB_CMNT, B.COMPUTER_ID,
B.CONTRACT, B.DTV_FAIL_CODE,
B.DTV_FAIL_DESC, B.TEST_END_DATE,
B.TEST_END_TIME, B.FAN_HALF_SPEED,
B.FAN_SPEED, B.HDD_ID,
B.HDD_MDL, B.HDD_POH,
B.HDD_SER, B.HDD_TEMP,
B.LINE_ID, B.MAC_ID,
B.OEM_NAME, B.STB_MDL,
B.OPERATOR_ID, B.RID,
B.RTE_ID, B.RSSI1_24GHz,
B.RSSI1_5GHz, B.RSSI2_24GHz,
B.RSSI2_5GHz, B.SCRIPT_ID,
B.SCRIPT_VER, B.SERVER_DRIVE_VER,
B.SITE_ID, B.SLOT_ID,
B.SER_NUM, B.SQ1_24GHz,
B.SQ1_5GHz, B.SQ2_24GHz,
B.SQ2_5GHz, B.SSID_24GHz,
B.SSID_5GHz, B.TEST_START_DATE,
B.TEST_START_TIME, B.SWIN,
B.SWOUT, B.TEST_RESULT,
B.TEST_TIME, B.TIME_TO_FAIL,
B.STB_TYPE, B.WORK_CENTER_ID
FROM AUTO_REPR_PAR A,
(
SELECT TEST_SEQ_NUM,
MAX(CASE WHEN PARM_NAME = 'BISTFAILCODE' THEN PARM_VAL END) BIST_FAIL_CODE,
MAX(CASE WHEN PARM_NAME = 'Client' THEN UPPER(PARM_VAL) END) STB_CLIENT,
MAX(CASE WHEN PARM_NAME = 'Comment' THEN UPPER(PARM_VAL) END) STB_CMNT,
MAX(CASE WHEN PARM_NAME = 'ComputerID' THEN UPPER(PARM_VAL) END) COMPUTER_ID,
MAX(CASE WHEN PARM_NAME = 'Contract' THEN UPPER(PARM_VAL) END) CONTRACT,
MAX(CASE WHEN PARM_NAME = 'DTVFAILCODE' THEN PARM_VAL END) DTV_FAIL_CODE,
MAX(CASE WHEN PARM_NAME = 'DTVFAILDESC' THEN PARM_VAL END) DTV_FAIL_DESC,
MAX(CASE WHEN PARM_NAME = 'EndDate' THEN CAST(PARM_VAL AS DATE FORMAT 'YYYYMMDD') END) TEST_END_DATE,
MAX(CASE WHEN PARM_NAME = 'EndTime' THEN (PARM_VAL (TIME, FORMAT 'HHMISS')) END) TEST_END_TIME,
MAX(CASE WHEN PARM_NAME = 'FANHalfSpeed' THEN PARM_VAL END) FAN_HALF_SPEED,
MAX(CASE WHEN PARM_NAME = 'FANSpeed' THEN PARM_VAL END) FAN_SPEED,
MAX(CASE WHEN PARM_NAME = 'HDDID' THEN UPPER(PARM_VAL) END) HDD_ID,
MAX(CASE WHEN PARM_NAME = 'HDDModel' THEN UPPER(PARM_VAL) END) HDD_MDL,
MAX(CASE WHEN PARM_NAME = 'HDDPOH' THEN PARM_VAL END) HDD_POH,
MAX(CASE WHEN PARM_NAME = 'HDDSerial' THEN PARM_VAL END) HDD_SER,
MAX(CASE WHEN PARM_NAME = 'HDDTEMP' THEN PARM_VAL END)HDD_TEMP,
MAX(CASE WHEN PARM_NAME = 'LineID' THEN PARM_VAL END) LINE_ID,
MAX(CASE WHEN PARM_NAME = 'MACID' THEN PARM_VAL END) MAC_ID,
MAX(CASE WHEN PARM_NAME = 'Manufacturer' THEN UPPER(PARM_VAL) END)OEM_NAME,
MAX(CASE WHEN PARM_NAME = 'Model' THEN UPPER(PARM_VAL) END) STB_MDL,
MAX(CASE WHEN PARM_NAME = 'OperatorID' THEN UPPER(PARM_VAL) END) OPERATOR_ID,
MAX(CASE WHEN PARM_NAME = 'RID' THEN PARM_VAL END)RID,
MAX(CASE WHEN PARM_NAME = 'RouteID' THEN UPPER(PARM_VAL) END)RTE_ID,
MAX(CASE WHEN PARM_NAME = 'RSSI1_24GHz' THEN PARM_VAL END)RSSI1_24GHz,
MAX(CASE WHEN PARM_NAME = 'RSSI1_5GHz' THEN PARM_VAL END) RSSI1_5GHz,
MAX(CASE WHEN PARM_NAME = 'RSSI2_24GHz' THEN PARM_VAL END) RSSI2_24GHz,
MAX(CASE WHEN PARM_NAME = 'RSSI2_5GHz' THEN PARM_VAL END) RSSI2_5GHz,
MAX(CASE WHEN PARM_NAME = 'ScriptID' THEN PARM_VAL END)SCRIPT_ID,
MAX(CASE WHEN PARM_NAME = 'ScriptVer' THEN PARM_VAL END)SCRIPT_VER,
MAX(CASE WHEN PARM_NAME = 'ServerDriveVer' THEN PARM_VAL END)SERVER_DRIVE_VER,
MAX(CASE WHEN PARM_NAME = 'SiteID' THEN UPPER(PARM_VAL) END)SITE_ID,
MAX(CASE WHEN PARM_NAME = 'SlotID' THEN PARM_VAL END) SLOT_ID,
MAX(CASE WHEN PARM_NAME = 'SN' THEN PARM_VAL END) SER_NUM,
MAX(CASE WHEN PARM_NAME = 'SQ1_24GHz' THEN PARM_VAL END) SQ1_24GHz,
MAX(CASE WHEN PARM_NAME = 'SQ1_5GHz' THEN PARM_VAL END) SQ1_5GHz,
MAX(CASE WHEN PARM_NAME = 'SQ2_24GHz' THEN PARM_VAL END) SQ2_24GHz,
MAX(CASE WHEN PARM_NAME = 'SQ2_5GHz' THEN PARM_VAL END) SQ2_5GHz,
MAX(CASE WHEN PARM_NAME = 'SSID_24GHz' THEN PARM_VAL END)SSID_24GHz,
MAX(CASE WHEN PARM_NAME = 'SSID_5GHz' THEN PARM_VAL END) SSID_5GHz,
MAX(CASE WHEN PARM_NAME = 'StartDate' THEN CAST(PARM_VAL AS DATE FORMAT 'YYYYMMDD') END) TEST_START_DATE,
MAX(CASE WHEN PARM_NAME = 'StartTime' THEN (PARM_VAL (TIME, FORMAT 'HHMISS')) END) TEST_START_TIME,
MAX(CASE WHEN PARM_NAME = 'SWin' THEN PARM_VAL END) SWIN,
MAX(CASE WHEN PARM_NAME = 'SWout' THEN PARM_VAL END) SWOUT,
MAX(CASE WHEN PARM_NAME = 'TestResult' THEN UPPER(PARM_VAL) END) TEST_RESULT,
MAX(CASE WHEN PARM_NAME = 'TestTime' THEN PARM_VAL END) TEST_TIME,
MAX(CASE WHEN PARM_NAME = 'TimetoFail' THEN PARM_VAL END) TIME_TO_FAIL,
MAX(CASE WHEN PARM_NAME = 'TYPE' THEN UPPER(PARM_VAL) END) STB_TYPE,
MAX(CASE WHEN PARM_NAME = 'WorkCenterID' THEN UPPER(PARM_VAL) END) WORK_CENTER_ID
FROM
(
SELECT TEST_SEQ_NUM,PARM_NAME,PARM_VAL,
ROW_NUMBER() OVER(PARTITION BY TEST_SEQ_NUM ORDER BY TEST_SEQ_NUM) SEQ
FROM AUTO_REPR_CHLD
) D
GROUP BY TEST_SEQ_NUM
)
B,
RMA_MFR_MDL_PAR_XREF C
WHERE A.TEST_SEQ_NUM=B.TEST_SEQ_NUM
AND A.LOC_1_NAME=B.SITE_ID
AND A.PROD_TYPE_DESC=C.MFR_SKU_CODE AND C.IRD_FLAG='Y'
这是从父表获取行数的SQL
SELECT LOC_1_NAME,SUBSTR(END_TIME_TEXT,1,10), COUNT(*) FROM DDWP_V.AUTO_REPR_PAR GROUP BY 1,2
我删除了从子表中选择的partition子句,没有更改。我遗漏了什么?问题是内部连接而不是外部连接。固定的
SEL
CAST( A.END_TIME_TEXT AS TIMESTAMP(0) ) END_TIME,
UPPER(A.OPER_NAME) OPER_NAME,
...B.TIME_TO_FAIL,
B.STB_TYPE,
B.WORK_CENTER_ID
FROM AUTO_REPR_PAR A
LEFT OUTER JOIN
(
SELECT TEST_SEQ_NUM,
MAX(CASE WHEN PARM_NAME = 'BISTFAILCODE' THEN PARM_VAL END) BIST_FAIL_CODE,
...
MAX(CASE WHEN PARM_NAME = 'MANUFACTURER' THEN UPPER(PARM_VAL) END)OEM_NAME,
MAX(CASE WHEN PARM_NAME = 'WORKCENTERID' THEN UPPER(PARM_VAL) END) WORK_CENTER_ID
FROM
(
SELECT TEST_SEQ_NUM,PARM_NAME,PARM_VAL
FROM AUTO_REPR_CHLD
) D
GROUP BY TEST_SEQ_NUM
)
B
ON
A.TEST_SEQ_NUM=B.TEST_SEQ_NUM
AND A.LOC_1_NAME=B.SITE_ID
LEFT OUTER JOIN RMA_MFR_MDL_PAR_XREF C
ON A.PROD_TYPE_DESC=C.MFR_SKU_CODE AND C.IRD_FLAG='Y'
WHERE
END_TIME IS NOT NULL
感谢大家的帮助。首先修复您的加入语法!您使用的是pre-92 join语法,这使得代码很难阅读。第二,为什么你认为计数是一样的?您正在
内部联接到多个表?为什么要在派生表中进行行号?你根本不用它。C.IRD_FLAG='Y'上有一个WHERE条件,在第二个select中缺少该条件。您是内部联接表。内部联接不仅可以复制行,还可以消除行:如果一个表中的行与另一个表中的行不匹配,则内部联接将排除该行。@AndriyM感谢您的解释。使用left-outer
连接是有意义的,因为父表记录等于许多子表记录。不,您可能会混淆其中的内容。外部联接(包括左外部联接)是指返回在另一侧不匹配的行。如果父表中的所有行都有匹配项(一行一行,二十行一行——没关系),那么内部联接就可以了,您将获得视图中的所有父行。但是,从左(外部)联接确实对您有所帮助这一事实来看,您的父表中的行必须在子表中没有匹配项。(实际上,我不知道左连接是否真的是您所需要的,我只是想帮助您理解其中的区别。)