Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 转置的父/子表的行数不正确_Sql - Fatal编程技术网

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
连接是有意义的,因为父表记录等于许多子表记录。不,您可能会混淆其中的内容。外部联接(包括左外部联接)是指返回在另一侧不匹配的行。如果父表中的所有行都有匹配项(一行一行,二十行一行——没关系),那么内部联接就可以了,您将获得视图中的所有父行。但是,从左(外部)联接确实对您有所帮助这一事实来看,您的父表中的行必须在子表中没有匹配项。(实际上,我不知道左连接是否真的是您所需要的,我只是想帮助您理解其中的区别。)