2011-05-10 41 views
2

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

贾斯汀

我需要加入CXADMIN.RO_FAILURE_DTL RFCXADMIN.RO_HIST RH[email protected] 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, 
    [email protected] 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

你需要指定(RH或RF)的连接条件(RP或CG)上的多个数据库的SQL查询(HTTP的 – MJB 2011-05-10 19:14:56

+0

可能重复:// stackoverflow.com/questions/5931652/sql-query-on-multiple-databases) – 2011-05-11 16:14:58

+0

请参阅[我的答案](http://stackoverflow.com/questions/5931652/sql-query-on-multiple-databases/5931791#5931791 )到你以前的问题。包括ansi-86和ANSI-92样式联接 – 2011-05-11 16:16:45

回答

1

这将是非常,非常有用的,如果你能告诉一些示例数据...

但是,如果没有的是,它看起来像您的加盟CXADMIN。 RO_FAILURE_DTL RF到 CXADMIN.RO_HIST RH,sa_repair_part @ elgsad到sa_code_group_task_dtl,但我看不出你如何将这两个组合在一起。所以,基本上,你应该得到两个交叉连接的查询;独特的条款只是减少了交叉连接的数量,但并没有真正的帮助。

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 [email protected] 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') 
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看起来像是FOLL OWS,通知更新的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 [email protected] 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') 
+0

查询不是非标准的,它只是使用较旧的标准。开始时没有“加入”关键字。 – Guffa 2011-05-10 19:25:20

+0

@Guffa - 你是对的。尽管现在我正在研究它,但似乎至少外连接隐式语法已被弃用,并且有些源使其看起来好像内连接隐式语法也被弃用,尽管它并不十分清楚。 http://msdn.microsoft.com/en-us/library/dd172122.aspx – 2011-05-10 19:33:26

1

我通常建议使用格式

FROM表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 ON RF.REPAIR_ORD = RH.REPAIR_ORD INNER JOIN [email protected] RP ON? INNER JOIN saadmin.sa_code_group_task_dtl @ELGSAD cg ON Rp.REPAIR_ORD = cg。REPAIR_ORD

看起来你缺少一个RP的ON子句到其余的表。这可能是你遇到的问题。

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 [email protected]   as rp on rp.REPAIR_ORD = rf.REPAIR_ORD 
join [email protected] 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') 
; 
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 !=""; 
相关问题