我必须加入四张桌子并遇到麻烦。我现在的查询是返回数据,但它不是我需要的数据。我认为我没有正确连接所有四个表。我如何正确加入桌子?谢谢。
贾斯汀
我需要将CXADMIN.RO_FAILURE_DTL RF
,CXADMIN.RO_HIST RH
,saadmin.sa_repair_part@elgsad rp
和saadmin.sa_code_group_task_dtl @ELGSAD cg
表格加在一起。
到目前为止,这是我的查询:
SELECT DISTINCT
RF.REPAIR_ORD,
RH.RECV_UNIT,
RH.RECV_SERIAL_NBR,
rf.created_date,
RP.FAULT_CODE,
RP.REPAIR_ACTION_CODE,
cg.task_code
FROM
CXADMIN.RO_FAILURE_DTL RF,
CXADMIN.RO_HIST RH,
saadmin.sa_repair_part@elgsad rp,
saadmin.sa_code_group_task_dtl @ELGSAD cg
WHERE
RF.REPAIR_ORD = RH.REPAIR_ORD
and Rp.REPAIR_ORD = cg.REPAIR_ORD
AND RF.FAILURE_CODE ='DISK'
AND RH.CURR_FACILITY_ID ='23'
AND RF.CREATED_DATE >'1-JUN-2010'
AND RF.CREATED_DATE < '1-dec-2010'
AND (CG.TASK_CODE ='PHMD'
OR CG.TASK_CODE ='PHSN'
OR CG.TASK_CODE ='CHMD'
OR CG.TASK_CODE ='CHSN')
答案 0 :(得分:2)
您的代码基本上是在进行交叉连接,但看起来您想要做的是内连接。
SELECT DISTINCT
RF.REPAIR_ORD,
RH.RECV_UNIT,
RH.RECV_SERIAL_NBR,
rf.created_date,
RP.FAULT_CODE,
RP.REPAIR_ACTION_CODE,
cg.task_code
FROM CXADMIN.RO_FAILURE_DTL RF
INNER JOIN CXADMIN.RO_HIST RH ON RF.REPAIR_ORD = RH.REPAIR_ORD
INNER JOIN saadmin.sa_repair_part@elgsad rp ON RF.REPAIR_ORD = rp.REPAIR_ORD
INNER JOIN saadmin.sa_code_group_task_dtl @ELGSAD cg ON RF.REPAIR_ORD = cg.REPAIR_ORD
WHERE
AND RF.FAILURE_CODE ='DISK'
AND RH.CURR_FACILITY_ID ='23'
AND RF.CREATED_DATE >'1-JUN-2010'
AND RF.CREATED_DATE < '1-dec-2010'
AND (CG.TASK_CODE ='PHMD'
OR CG.TASK_CODE ='PHSN'
OR CG.TASK_CODE ='CHMD'
OR CG.TASK_CODE ='CHSN')
答案 1 :(得分:2)
有一些标准问题是您不遵守的,但减去我看到的一个问题。您是从RF开始的,并且您已在RH上建立了
的连接条件RF.REPAIR_ORD = RH.REPAIR_ORD
然后,您已经使用
建立了从RP到CG的连接条件Rp.REPAIR_ORD = cg.REPAIR_ORD
然而,(我在这里猜测)我相信你需要建立从RF到RP的条件
RF.REPAIR_ORD = RP.REPAIR_ORD
我正在讨论的标准问题是,您可以将其清理一下并使SP看起来如下,请注意更新的JOIN部分
SELECT DISTINCT
RF.REPAIR_ORD,
RH.RECV_UNIT,
RH.RECV_SERIAL_NBR,
rf.created_date,
RP.FAULT_CODE,
RP.REPAIR_ACTION_CODE,
cg.task_code
FROM
CXADMIN.RO_FAILURE_DTL RF
JOIN CXADMIN.RO_HIST RH ON RF.REPAIR_ORD = RH.REPAIR_ORD
JOIN saadmin.sa_repair_part@elgsad rp ON RP.REPAIR_ORD = RH.REPAIR_ORD
JOIN saadmin.sa_code_group_task_dtl @ELGSAD cg ON Rp.REPAIR_ORD = cg.REPAIR_ORD
WHERE
RF.FAILURE_CODE ='DISK'
AND RH.CURR_FACILITY_ID ='23'
AND RF.CREATED_DATE >'1-JUN-2010'
AND RF.CREATED_DATE < '1-dec-2010'
AND (CG.TASK_CODE ='PHMD'
OR CG.TASK_CODE ='PHSN'
OR CG.TASK_CODE ='CHMD'
OR CG.TASK_CODE ='CHSN')
答案 2 :(得分:1)
如果你能展示一些样本数据,真的非常有用......
但是没有它,看起来你加入了CXADMIN.RO_FAILURE_DTL RF to CXADMIN.RO_HIST RH和sa_repair_part @ elgsad到sa_code_group_task_dtl,但我看不出你是如何加入这两个组在一起。所以,基本上,你应该得到两个查询,交叉连接在一起; distinct子句只是减少交叉连接的数量,但并没有真正帮助。
答案 3 :(得分:1)
我通常建议使用格式
FROM table t1 LEFT | INNER JOIN table2 t2 ON t1.colname = t2.colname
而不是
FROM table1,table2。
我会尝试以下连接,看看它是否适合你。
FROM CXADMIN.RO_FAILURE_DTL RF INNER JOIN CXADMIN.RO_HIST RH 在RF.REPAIR_ORD = RH.REPAIR_ORD上 INNER JOIN saadmin.sa_repair_part@elgsad rp 上 ? INNER JOIN saadmin.sa_code_group_task_dtl @ELGSAD cg ON Rp.REPAIR_ORD = cg.REPAIR_ORD
看来你错过了其他表的RP的ON子句。这可能是你遇到的问题。
答案 4 :(得分:1)
尝试:
select
--
-- your columns here
--
FROM CXADMIN.RO_FAILURE_DTL as rf
join CXADMIN.RO_HIST as rh on rh.REPAIR_ORD = rf.REPAIR_ORD
join saadmin.sa_repair_part@elgsad as rp on rp.REPAIR_ORD = rf.REPAIR_ORD
join saadmin.sa_code_group_task_dtl@ELGSAD as cg on cg.REPAIR_ORD = rf.REPAIR_ORD
WHERE RF.FAILURE_CODE ='DISK'
AND RH.CURR_FACILITY_ID ='23'
AND RF.CREATED_DATE >'1-JUN-2010'
AND RF.CREATED_DATE < '1-dec-2010'
AND CG.TASK_CODE in ('PHMD', 'PHSN', 'CHMD', 'CHSN')
;
答案 5 :(得分:0)
SELECT * FROM TABLEA.a inner join TABLEB.b ON TABLEB.b = TABLEA.a inner join TABLEB.c ON TABLEB.C = TABLEA.b inner join TABLEB.d ON TABLEB.d = TABLEA.c WHERE TABLEA.id !="";