Sql 在查询中正确地包含空值和联接
我使用的是OracleSQLDeveloper,我试图生成结果,其中包括按日期范围搜索的特定条件下的客户信息。我觉得我很接近,但我希望包括适用所有标准但尚未付款的账户 我的预期结果如下所示:Sql 在查询中正确地包含空值和联接,sql,join,left-join,oracle-sqldeveloper,self-join,Sql,Join,Left Join,Oracle Sqldeveloper,Self Join,我使用的是OracleSQLDeveloper,我试图生成结果,其中包括按日期范围搜索的特定条件下的客户信息。我觉得我很接近,但我希望包括适用所有标准但尚未付款的账户 我的预期结果如下所示: CYCLENUMB | WOCREATIONDATE | POSTINGDATE | CUSTOMERNUMBER | FIRSTNAME | LASTNAME | ADDRESS | WOORDERTYPE | DESCRIPTION | PAYMENT 12 | 29-
CYCLENUMB | WOCREATIONDATE | POSTINGDATE | CUSTOMERNUMBER | FIRSTNAME | LASTNAME | ADDRESS | WOORDERTYPE | DESCRIPTION | PAYMENT
12 | 29-JUL-20 | 01-AUG-20 | 345506 | Luke | Skywalker| 123 Lakeway Dr. | 636 |Completed | $100
24 | 01-AUG-20 | 07-AUG-20 | 456923 | Leia | Skywalker| 456 Lakeway Dr. | 636 |Completed | $300
35 | 17-AUG-20 | 24-AUG-20 | 596854 | Chewy | Wookie | 789 Lakeway Dr. | 636 |Completed | NULL
80 | 21-AUG-20 | 28-AUG-20 | 695067 | Han | Solo | 432 Wrongturn Dr.| 636 |Completed | NULL
66 | 25-AUG-20 | 30-AUG-20 | 235645 | Count | Dooku | 534 Wrongturn Dr.| 636 |Completed | $225
但是我的结果就是这样
CYCLENUMB | WOCREATIONDATE | POSTINGDATE | CUSTOMERNUMBER | FIRSTNAME | LASTNAME | ADDRESS | WOORDERTYPE | DESCRIPTION | PAYMENT
12 | 29-JUL-20 | 01-AUG-20 | 345506 | Luke | Skywalker| 123 Lakeway Dr. | 636 |Completed | $100
24 | 01-AUG-20 | 07-AUG-20 | 456923 | Leia | Skywalker| 456 Lakeway Dr. | 636 |Completed | $300
66 | 25-AUG-20 | 30-AUG-20 | 235645 | Count | Dooku | 534 Wrongturn Dr.| 636 |Completed | $225
下面是我试图运行的查询
select customermaster.cyclenumber as CYCLENUMB,
workorder.creationdate as WOCREATIONDATE,
MAX(cushistory.postingdate) as POSTINGDATE,
cushistory.customernumber as CUSTOMERNUMBER,
customerpersonalinfo.firstname as FIRSTNAME,
customerpersonalinfo.lastname as LASTNAME,
premiseaddress.Concatenated_Address as ADDRESS,
workorder.ordertype as WOORDERTYPE,
workorderstatus.description as DESCRIPTION,
SUM(cushistory.moneysegment1) as PAYMENT
from customermaster, workorder, customerpersonalinfo,
(select
premiseaddress.company as COMPANY,
premiseaddress.premisenumber as PREMISENUMBER,
((to_char(premiseaddress.currpremisestreetnumber) || ' ') || premiseaddress.currpremisestreetname) as Concatenated_Address
from premiseaddress)
premiseaddress, workorderstatus, cushistory
where workorder.ordertype = 636
and cushistory.moneytypecode1 = 7
and workorder.application = 3
and cushistory.postingdate between '01-Aug-20' and '31-Aug-20'
and customermaster.customernumber = cushistory.customernumber
and cushistory.customernumber = workorder.customernumber
and customermaster.company = workorder.company
and customermaster.accounttype = workorder.application
and customermaster.customernumber = workorder.customernumber
and workorder.application = workorderstatus.application
and workorder.completecode = workorderstatus.workorderstatus
and customermaster.company = customerpersonalinfo.company
and customermaster.occupantcisnumber =customerpersonalinfo.cisnumber
and customermaster.company = premiseaddress.company
and customermaster.premisenumber = premiseaddress.premisenumber
GROUP BY customermaster.cyclenumber,
workorder.wocreationdate ,
cushistory.postingdate,
customermaster.customernumber,
customerpersonalinfo.firstname,
customerpersonalinfo.lastname,
premiseaddress.Concatenated_Address,
workorder.ordertype,
workorderstatus.description
ORDER BY workorder.creationdate asc
我包含了一个子查询,用于简化客户地址。Postingdate from cushistory是我正在申请的日期范围文件管理器
请注意,custhistory表是保存客户编号和付款的主表。我想将其与workorder表左连接,以包含空值,但还没有找到一种可靠的方法。问题是您使用的是旧式隐式连接,即使用逗号分隔表,并在where子句中包含所有条件(join和filter)。这远远不是最佳实践,并导致您现在看到的问题。相反,在where子句中使用正确定义的联接(内部联接和左侧联接)和on子句作为联接条件,并使用筛选条件。这将给你你想要的结果。这澄清了事情谢谢你的建议。我已经尝试过重新构造查询,但是我仍然不太熟悉如何进行查询,以及哪些条件将进入哪个连接。还有,我将如何加入我的子查询?我可以建议查看一些关于加入的教程吗。。。我无法在评论中解释,也没有时间重新编写您的整个查询。加入条件通常只是您的PK/FK关系。以完全相同的方式联接子查询。但是有1000个示例和教程。是的,您使用的是SQL-89连接(那是lambada年吗?)。使用SQL-92联接要简单得多。请在代码问题中给出一个--cut&paste&runnable代码,包括作为代码输入的最小代表性示例;期望和实际输出(包括逐字记录错误消息);标签和版本;清晰的说明和解释。尽可能少地给出代码,即显示为OK的代码,并通过显示为not OK的代码进行扩展。(调试基础。)用于包含DBMS和DDL(包括约束和索引)的SQL,并将其作为格式化为表的代码输入。在总体目标上暂停工作,在第一个表达中删去代码,不要给出你期望的,说出你期望的,为什么。