【发布时间】:2017-08-30 19:33:20
【问题描述】:
我是 SQL 和 PLSQL 的新手。我在想有一种方法可以加入这两个查询,但我很难过。它们完全相同,除了第一个查询找到一个不同的 e.identifying_party,比如“5111”,然后第二个查询使用 e.identifying_party = “5111”找到一个不同的 child_id。
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;
另外,我正在调试别人的代码,所以如果有任何其他编辑或缺失信息,请告诉我。谢谢!
【问题讨论】:
-
从不在
from子句中使用逗号。 始终使用正确、明确的join语法。 -
您不应再使用 1980 年代的这种连接语法。出于某种原因,在 1992 年引入了显式连接。不要将日期与字符串进行比较。尤其是那些包含您希望 DBMS 正确理解和解释的某种语言的日期名称的文件。立即使用日期文字:
AND (v.end_dt >= DATE '2017-04-01' AND v.end_dt < '2017-04-02'。不要使用混淆别名。c与发票有什么关系?使用i或inv或其他我们可以阅读和理解的内容。 -
你是什么意思加入?你希望你的结果如何?如果您在第一个查询中使用 Select distinct e.identifying_party, b.child_id,您还将获得 child_id,它的 identify_party = 5111 这是您第二个查询的条件。
-
嗨!只是想说我注意到您有一个名为“case”的表,这是 SQL 中的保留字(至少是 Oracle 和 Mssql)。这可能会导致不可预测的行为,最好避免。
-
感谢@ThorstenKettner 的编辑!