2016-08-03 39 views
0

任何人都可以幫忙嗎?我是一個腳本noob ..下面的腳本(沒有BOLDED部分給了我空的結果),如果我包含BOLDED部分,它告訴我太多的值。加入3個表空

實際上對於粗體部分,我想要的是從三個不同的表中提取。

表A(OR_ORDER)它由

ID | CLASS | FACILITY | SOURCE_TYPE | SOURCE_CODE 
    101  IP  XY   N   W010 
    102  IP  XY   N   W023 
    103  OP  SX   C   E122 
    114  OP  XY   C   R123 

表d(IP_NURSING_UNIT)它由

NURSING_UNIT_CODE | SOURCE_TYPE | LONG_DESC 
W010      N   Ward 10 
W023      N   Ward 23 

表H(OP_CLINIC)它由

CLINIC_CODE | SOURCE_TYPE | LONG_DESC 
E122    C   Eye Clinic 
R123    C   Dental 

我希望預期的輸出如下所示。只要在long_desc列上添加...取決於source_type。如果SOURCE_TYPE是N,那麼它應該提取表d數據..和如果SOURCE_TYPE是C,那麼它應該提取表數據H..but我不知道如何加入他們..

ID | CLASS | FACILITY | SOURCE_TYPE | SOURCE_CODE | LONG_DESC 
101  IP  XY   N   W010  Ward 10 
102  IP  XY   N   W023  Ward 23 
103  OP  SX   C   E122  Eye Clinic 
114  OP  XY   C   R123  Dental 

查詢:

SELECT 
    A.ID, A.CLASS, C.FACILITY_NAME, A.SOURCE_TYPE, 
    (SELECT a.source_code, d.LONG_DESC 
    FROM OR_ORDER A 
    INNER JOIN IP_NURSING_UNIT D ON a.source_code = d.nursing_unit_code 
    INNER JOIN OP_CLINIC H ON a.source_code = h.clinic_code), 
    B.ORDER_ID, B.ORDER_CATALOG_CODE, B.CATALOG_DESC, 
    B.START_DATE_TIME, B.END_DATE_TIME, B.ORDER_QTY, 
    F.LONG_DESC, G.PUBLIC_PRICE, E.PRACTITIONER_NAME 
FROM 
    OR_ORDER A, OR_ORDER_LINE B, SM_FACILITY_PARAM C, 
    IP_NURSING_UNIT D, AM_PRACTITIONER E, AM_UOM F, 
    BL_ST_ITEM_BY_PERIOD G, OP_CLINIC H 
WHERE 
    A.CLASS = 'OP'  
    AND A.ORDER_ID = B.ORDER_ID  
    AND A.ORDERING_FACILITY_ID = C.FACILITY_ID  
    AND A.ORDERING_FACILITY_ID = D.FACILITY_ID  
    AND A.ORDERING_FACILITY_ID = H.FACILITY_ID  
    AND A.SOURCE_CODE = D.NURSING_UNIT_CODE  
    AND A.SOURCE_CODE =H.CLINIC_CODE  
    AND B.ORD_PRACT_ID = E.PRACTITIONER_ID  
    AND (G.item_code = B.ORDER_CATALOG_CODE 
    AND G.OPERATING_FACILITY_ID = 'RP' AND G.EFFECTIVE_TO_DATE IS NULL) 
    AND B.ORDER_UOM = F.UOM_CODE AND B.ORD_DATE_TIME BETWEEN TO_DATE('05/02/2016 08:20:00', 'MM/DD/YYYY HH24:MI:SS') AND 

TO_DATE('05/02/2016 08:30:00' , 'MM/DD/YYYY HH24:MI:SS') ORDER BY B.ORD_PRACT_ID

任何幫助非常感謝。在此先感謝

+0

[不良習慣踢:使用舊式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style- joins.aspx) - 在ANSI - ** 92 ** SQL標準中**舊式*逗號分隔的表*樣式列表已替換爲* proper * ANSI'JOIN'語法(**超過20年**前),其使用是不鼓勵 –

回答

2

你似乎想left join

select o.*, coalesce(nu.long_desc, c.long_desc) as long_desc 
from or_order o left join 
    ip_nursing_unit nu 
    on o.source_code = nu.source_code and 
     o.source_type = nu.source_type left join 
    op_clinic c 
    on o.source_code = c.source_code and 
     o.source_type = c.source_type; 

您的查詢方式過於複雜。另外,它不使用正確的,明確的JOIN語法。簡單的規則:從不FROM子句中使用逗號。 始終使用使用正確的,明確的JOIN語法。

您可能有其他需要添加到查詢中的條件。

+0

謝謝戈登的反饋..它的工作原理!但我不想從or_order o中提取所有列...但我想我知道如何只獲取某些列。你提到_NEVER_在'FROM'子句中使用逗號..我只知道,因爲我看到的所有其他腳本都向我發送了逗號。呵呵..所以現在我不知道如何加入與or_order無關的附加表格 –

+0

@HjhMimiZol。 。 。你可以選擇你想要的任何列。 '*'方便顯示查詢的結構。 –