我如何一起加入四张桌子?

时间:2011-05-10 19:11:18

标签: sql

我必须加入四张桌子并遇到麻烦。我现在的查询是返回数据,但它不是我需要的数据。我认为我没有正确连接所有四个表。我如何正确加入桌子?谢谢。

贾斯汀

我需要将CXADMIN.RO_FAILURE_DTL RFCXADMIN.RO_HIST RHsaadmin.sa_repair_part@elgsad rpsaadmin.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')

6 个答案:

答案 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 !="";