2016-08-03 139 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。 。 。你可以选择你想要的任何列。 '*'方便显示查询的结构。 –