Sql 在查询中正确地包含空值和联接

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-

我使用的是OracleSQLDeveloper,我试图生成结果,其中包括按日期范围搜索的特定条件下的客户信息。我觉得我很接近,但我希望包括适用所有标准但尚未付款的账户

我的预期结果如下所示:

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,并将其作为格式化为表的代码输入。在总体目标上暂停工作,在第一个表达中删去代码,不要给出你期望的,说出你期望的,为什么。