我有两个应该返回类似结果的查询,一个与另一个相反。但是只有其中一个有效。
查询号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错误是否会生效?
非常感谢任何帮助。
由于 利安
答案 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
。