2017-08-30 73 views
0

我是新来的SQL和PLSQL。我想有一种方法可以加入这两个查询,但我很难过。它们是完全一样的,除了所述第一查询找到一个不同e.identifying_party,说“5111”,那么第二个发现使用e.identifying_party =“5111”的独特child_id。合并2个SQL查询到1个使用结果从第一

SELECT DISTINCT e.identifying_party 
FROM voucher b, 
    cc_authorization d, 
    case e, 
     episode g, 
     invoice c, 
     invoice_item f, 
     svcperiod_info v 
    WHERE b.cc_authorization_id = d.cc_authorization_id 
    AND d.subsidy_id   = g.episode_id 
    AND g.case_id    = e.case_id 
    AND b.voucher_id   = f.voucher_id 
    AND f.invoice_id   = c.invoice_id 
    AND v.svcperiod_id   = c.svcperiod_id 
    AND f.status    = 8 
    AND f.net_amount   > 0 
    AND (v.end_dt    >= '01-APR-17' 
    AND v.end_dt    < '02-APR-17') 
    AND e.case_id    <4000; 

第二个查询是完全一样的,但使用的输入e.identifying_party:

SELECT DISTINCT b.child_id 
FROM voucher b, 
    cc_authorization d, 
    case e, 
     episode g, 
     invoice c, 
     invoice_item f, 
     svcperiod_info v 
    WHERE b.cc_authorization_id = d.cc_authorization_id 
    AND d.subsidy_id   = g.episode_id 
    AND g.case_id    = e.case_id 
    AND b.voucher_id   = f.voucher_id 
    AND f.invoice_id   = c.invoice_id 
    AND v.svcperiod_id   = c.svcperiod_id 
    AND f.status    = 8 
    AND f.net_amount   > 0 
    AND (v.end_dt    >= '01-APR-17' 
    AND v.end_dt    < '02-APR-17') 
    AND e.identifying_party  = 5111 
    AND e.case_id    <4000; 

而且,我调试别人的代码,因此,如果有任何其他修改或丢失信息, 请告诉我。谢谢!

+2

*不要*的'from'子句中使用逗号。 *总是*使用正确的,明确的'join'语法。 –

+3

您不应再使用80年代的这种连接语法。 1992年引入了显式联接是有原因的。不要将日期与字符串进行比较。特别是在某些语言中不包含日期名称的情况下,您希望DBMS能够正确理解和解释。使用日期文字instaead:'AND(v.end_dt> = DATE '2017年4月1日' AND v.end_dt <“2017-04-02''不要混淆别名有什么信'C'。使用'i'或'inv'或其他我们可以阅读和理解的东西 –

+0

你是什么意思加入?你喜欢你的结果吗?如果你使用Select distinct e.identifying_party,b.child_id on你的第一个查询,你也会得到具有identify_party = 5111这是你的第二个查询条件的child_id。 –

回答

0

由于查询是除了特定领域相同你拔出,那么在逻辑上的查询将返回所有你需要的数据 - 你只需要问它:

SELECT DISTINCT e.identifying_party, b.child_id 
    FROM voucher b 
    INNER JOIN cc_authorization d 
    ON d.cc_authorization_id = b.cc_authorization_id 
    INNER JOIN episode g 
    ON g.subsidy_id = d.episode_id 
    INNER JOIN case e 
    ON e.case_id = g.case_id 
    INNER JOIN invoice_item f 
    ON f.voucher_id = b.voucher_id 
    INNER JOIN invoice c 
    ON c.invoice_id = f.invoice_id 
    INNER JOIN svcperiod_info v 
    ON v.svcperiod_id = c.svcperiod_id 
    WHERE f.status  = 8 AND 
     f.net_amount > 0 AND 
     v.end_dt >= '01-APR-17' AND 
     v.end_dt < '02-APR-17' AND 
     e.case_id < 4000 
    ORDER BY IDENTIFYING_PARTY, CHILD_ID 

在这里,我改写了查询使用“现代”连接(SQL-92 - 25年“新” - 我的,飞行时间如何:-)但原始查询应该工作得很好。

这会给你IDENTIFYING_PARTY和CHILD_ID的不同组合。我添加了ORDER BY以确保结果以合理的顺序返回。

祝你好运。

+0

谢谢!这正是我需要的! – Flynn

0

加入的一个方式是:我已经使用e1别名子查询表case

Select distinct b.child_id   
     From voucher b, cc_authorization d, case e, episode g, invoice c, invoice_item f, svcperiod_info v   
     Where b.cc_authorization_id = d.cc_authorization_id and d.subsidy_id = g.episode_id and g.case_id = e.case_id  
     and b.voucher_id = f.voucher_id and f.invoice_id = c.invoice_id and v.svcperiod_id = c.svcperiod_id 
     and f.status = 8 and f.net_amount > 0 and (v.end_dt >= '01-APR-17' and v.end_dt < '02-APR-17') and e.case_id<4000 and e.identifying_party in (Select distinct e1.identifying_party   
      From voucher b, cc_authorization d, case e1, episode g, invoice c, invoice_item f, svcperiod_info v   
      Where b.cc_authorization_id = d.cc_authorization_id and d.subsidy_id = g.episode_id and g.case_id = e1.case_id  
      and b.voucher_id = f.voucher_id and f.invoice_id = c.invoice_id and v.svcperiod_id = c.svcperiod_id 
      and f.status = 8 and f.net_amount > 0 and (v.end_dt >= '01-APR-17' and v.end_dt < '02-APR-17') and e1.case_id<4000); 

通知。您可能需要为sub = query中的其他表使用不同的别名。

+0

感谢您的反馈。我想我希望有一个更简洁的方式,但也许这是唯一的方法! – Flynn

+0

可以完成一些优化,但我认为需要了解表格和关系的更多细节。 – MKR

+0

是的,这就是我的想法......他们目前太大而且复杂,只是一段简单的信息。谢谢您的回答! – Flynn

0

根据别人的建议,你说对查询的东西,这可能是工作:

SELECT DISTINCT v.child_id 
FROM voucher v 
INNER JOIN cc_authorization cca ON v.cc_authorization_id = cca.cc_authorization_id 
INNER JOIN episode ep cca.subsidy_id = ep.episode_id 
INNER JOIN case ca ON ep.case_id = ca.case_id 
INNER JOIN invoice_item it ON d.voucher_id = it.voucher_id 
INNER JOIN invoice inv ON it.invoice_id = inv.invoice_id 
INNER JOIN svcperiod_info spi ON inv.svcperiod_id = spi.svcperdiod_id 
WHERE it.status = 8 
AND it.net_amount > 0 
AND (spi.end_dt >= DATE'01-APR-17' AND spi.end_dt < DATE'02-APR-17') 
AND ca.case_id < 4000 
AND ca.identifying_party IN (
    SELECT DISTINCT ca1.identifying_party 
    FROM voucher v 
    INNER JOIN cc_authorization cca ON v.cc_authorization_id = cca.cc_authorization_id 
    INNER JOIN episode ep cca.subsidy_id = ep.episode_id 
    INNER JOIN case ca1 ON ep.case_id = ca.case_id 
    INNER JOIN invoice_item it ON d.voucher_id = it.voucher_id 
    INNER JOIN invoice inv ON it.invoice_id = inv.invoice_id 
    INNER JOIN svcperiod_info spi ON inv.svcperiod_id = spi.svcperdiod_id 
    WHERE it.status = 8 
    AND it.net_amount > 0 
    AND (spi.end_dt >= DATE'01-APR-17' AND spi.end_dt < DATE'02-APR-17') 
    AND ca.case_id < 4000 
); 

注意我是如何改变了联接使用ANSI标准联接并给予每个表更适当的别名。

不过,我认为还可以提高,如果你能提供有关数据的详细信息。为什么我们需要在内部和外部查询中运行相同的逻辑?它们是否可以组合成相同的查询(例如SELECT DISTINCT v.child_id,ca1.identifying_party ...)?

+0

原作者正在做的是从第一个querie创建一个列表,然后循环第二个querie从创建的列表中拉出一个值(ca.identifying_party) – Flynn

相关问题