左连接不工作 & 无法绑定多部分标识符

Left Join Not Working & Multi-part identifier could not be bound

我有两个查询应该return 相似的结果,一个与另一个相反。然而只有其中一个有效。

查询 1 - 版本 1 - 工作正常:

SELECT CASE WHEN d.description LIKE 'Dom%' Then 'Domestic' ELSE 'Non-Domestic' END AS PropTypeDecode,
       CAST(p.reference AS VARCHAR(10)) + CAST(p.propcheckdigit AS VARCHAR(1)) AS PropRef,
          p.propstat,
       CAST(c.reference AS VARCHAR(10)) + CAST(C.custcheckdigit AS VARCHAR(1)) AS CustRef
  FROM dbo.pproperty p
       JOIN dbo.sdecode d on p.proptype = d.itemcode and d.groupcode = 'proptype'
          LEFT JOIN dbo.ccustomer c on p.occcustno = c.reference
    order by p.reference+0 asc

它 return 是我正在寻找的布局类型的结果,并允许我识别所有 属性 号码(左 table)和相关的客户号码(右table) 包括那些没有关联客户编号的属性 - 'custref' returned 为 00。

我的第二个查询需要做相反的事情 - return 所有客户号码的列表(左 table)及其关联的 属性 号码(右 table)和 return 00,其中没有关联的 属性 号码。还需要判断returned 属性号码是国内还是非国内,类似第一次查询的结果。这就是我尝试编写第二个查询的方式:

查询 2 - 版本 1

SELECT CASE WHEN d.description LIKE 'Dom%' Then 'Domestic' ELSE 'Non-Domestic' END AS PropTypeDecode,
       CAST(c.reference AS VARCHAR(10)) + CAST(C.custcheckdigit AS VARCHAR(1)) AS CustRef,
       c.floating,
       CAST(p.reference AS VARCHAR(10)) + CAST(p.propcheckdigit AS VARCHAR(1)) AS PropRef,
       p.propstat
  FROM dbo.ccustomer c
       JOIN dbo.sdecode d on p.proptype = d.itemcode and d.groupcode = 'proptype'
          LEFT JOIN dbo.pproperty p on c.reference = p.occcustno
    order by c.reference+0 asc

然而我得到的唯一结果是:

Msg 4104, Level 16, State 1, Line 7 The multi-part identifier "p.proptype" could not be bound.

因此,为了尝试修复此问题(看看它是否是唯一的问题),我删除了 CASE WHEN 行和 JOIN dbo.sdecode 行。但是,在我的第一个查询中,我得到的 table 基本上与 returned 相同,只是列顺序不同,这不是我想要的。在这种情况下,LEFT JOIN 似乎将客户编号作为右 table 匹配到 属性 编号作为左 table,而不是相反。

查询 2 - 版本 2

SELECT CAST(c.reference AS VARCHAR(10)) + CAST(C.custcheckdigit AS VARCHAR(1)) AS CustRef,
       c.floating,
       CAST(p.reference AS VARCHAR(10)) + CAST(p.propcheckdigit AS VARCHAR(1)) AS PropRef,
       p.propstat
  FROM dbo.ccustomer c
          LEFT JOIN dbo.pproperty p on c.reference = p.occcustno
    order by c.reference+0 asc

我不完全确定发生了什么,因为我认为我已经了解了 JOIN 的工作原理,现在我很困惑。我已经阅读了这里的一些帖子,但我看不到他们的解决方案在这种情况下是如何工作的。

我理想的解决方案是查询 1 号和 2 号版本 1,但是多部分标识符阻止 2.1 最初工作,如果修复,2.2 错误会生效吗?

非常感谢任何帮助。

谢谢 利亚姆

你的问题在这里,在 FROM 的第二行。您正在将 JOIN 与 p.proptype 一起使用,并且 p 仅在稍后在第 3 行中声明:

FROM dbo.ccustomer c
       JOIN dbo.sdecode d on p.proptype = d.itemcode and d.groupcode = 'proptype'
          LEFT JOIN dbo.pproperty p on c.reference = p.occcustno

您可以这样更改加入条件:

FROM dbo.ccustomer c
       JOIN dbo.sdecode d on d.groupcode = 'proptype'
          LEFT JOIN dbo.pproperty p on c.reference = p.occcustno and p.proptype = d.itemcode

请注意 p 和 d 连接的条件现在位于第 3 行

第二种解决方案是更改连接顺序:

 FROM dbo.ccustomer c
LEFT JOIN dbo.pproperty p on c.reference = p.occcustno
JOIN dbo.sdecode d on p.proptype = d.itemcode and d.groupcode = 'proptype'

这是您原来的 FROM 有效子句:

FROM dbo.pproperty p JOIN
     dbo.sdecode d 
     ON p.proptype = d.itemcode and d.groupcode = 'proptype' LEFT JOIN
     dbo.ccustomer c 
     ON p.occcustno = c.reference

如果要return所有客户,则以所有ccustomer作为第一个table开始,然后使用LEFT JOIN和适当的条件:

FROM dbo.ccustomer c  LEFT JOIN
     dbo.property p
     ON p.occcustno = c.reference LEFT JOIN
     dbo.sdecode d 
     ON p.proptype = d.itemcode and d.groupcode = 'proptype'

请注意 d.description 可能是 NULL,因为可能没有匹配的行。即 p 可能不匹配 c 并且 d 取决于 p.