左连接不工作 & 无法绑定多部分标识符
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
.
我有两个查询应该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
.