左加入不工作&多部分标识符无法绑定

时间:2018-06-15 09:07:41

标签: sql left-join sql-server-2014

我有两个应该返回类似结果的查询,一个与另一个相反。但是只有其中一个有效。

查询号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

它返回我正在寻找的布局类型的结果,并允许我识别所有属性编号(左表)和关联的客户编号(右表),包括那些没有关联客户编号的属性 - & #39; custref'返回00。

我的第二个查询需要反过来 - 返回所有客户编号(左表)及其相关属性编号(右表)的列表,并返回00,其中没有关联的属性编号。它还需要确定返回的属性编号是国内还是非国内,类似于第一个查询的结果。这就是我尝试编写第二个查询的方法:

查询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   多部分标识符" p.proptype"无法受约束。

所以试图解决这个问题,看看它是否是唯一的问题,我删除了CASE WHEN行和JOIN dbo.sdecode行。但是我基本上得到了与我的第一个查询中返回的相同的表,只是使用了不同的列顺序,这不是我想要的。在这种情况下,LEFT JOIN似乎将客户编号作为右表与属性编号匹配为左表,而不是相反。

查询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号版本但是多部分标识符阻止2.1最初工作,如果修复,2.2错误是否会生效?

非常感谢任何帮助。

由于 利安

2 个答案:

答案 0 :(得分:0)

你的问题在这里,在FROM的第二行。您正在使用带有p.proptype的JOIN,而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'

答案 1 :(得分:0)

这是你的原始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

如果您想要退回所有客户,请从所有ccustomer作为第一个表开始,然后使用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