Table 1(Validproduct): Table 2(Registredproduct):
ProductId Name ID ProductId Quantity REGISTRATIONID
1 chair 1 2 10 1111
2 table 2 2 11 2222
3 desk
我正在寻找的是客户ID 1111
的结果Name Quantity
Table 10
Chair 0
Desk 0
我试过这个,但它只给了我存在于Registredproduct
中的产品SELECT vp.name as 'Product', rp.quantity as 'quantity'
FROM Validproduct vp
Left JOIN RegistrationProduct rp on
vp.ValidproductID = rp.ValidproductID
WHERE REGISTRATIONID = 1111
enter code here
并获得此结果
Name Quantity
Table 10
答案 0 :(得分:1)
您的查询存在的问题是,WHERE
子句通过限制REGISTRATIONID
位于顶层,将您的外部联接转变为内部联接:
SELECT vp.name as 'Product', rp.quantity as 'quantity'
FROM Validproduct vp
LEFT JOIN RegistrationProduct rp on vp.ValidproductID = rp.ValidproductID
WHERE REGISTRATIONID = 1111 -- TOP LEVEL
这消除了不存在REGISTRATIONID
行的所有结果,从而减少了您想要获得的最后两个结果。
将其移至联接级别将删除限制:
SELECT
vp.name as 'Product'
, rp.quantity as 'quantity'
FROM Validproduct vp
LEFT JOIN RegistrationProduct rp
on vp.ValidproductID = rp.ValidproductID AND REGISTRATIONID = 1111
现在您的数量会NULL
。使用null coalesce expression生成零:
SELECT
vp.name as 'Product'
, COALESCE(rp.quantity, 0) as 'quantity'
FROM Validproduct vp
LEFT JOIN RegistrationProduct rp
on vp.ValidproductID = rp.ValidproductID AND REGISTRATIONID = 1111
答案 1 :(得分:1)
在连接后应用where
子句,并过滤结果中的行。您应该将条件移动到连接。此外,您可能希望使用coalesce
调用将零计数替换为零:
SELECT vp.name As Product, COALESCE(rp.quantity, 0) AS Quantity
FROM Validproduct vp
LEFT JOIN RegistrationProduct rp ON
vp.ValidproductID = rp.ValidproductID AND REGISTRATIONID = 1111
答案 2 :(得分:1)
应用于LEFT或右连接的where子句中的过滤条件必须来自包含所有记录的表。否则,您将删除那些具有空值的记录。
SELECT vp.name as 'Product', coalesce(rp.quantity,0) as 'quantity'
FROM Validproduct vp
LEFT JOIN RegistrationProduct rp
on vp.ValidproductID = rp.ValidproductID
and REGISTRATIONID = 1111
答案 3 :(得分:1)
当"右"中没有匹配的记录时表,左连接产生一个连接记录,其中所有列都来自"右" table有NULL值;所以你的WHERE条件与它们不匹配。
最简单的解决方法是使过滤条件成为连接条件的一部分。一般来说,这种方法最简单 - 只需将条件从WHERE
移到连接的ON
子句即可。其他选项也可能效率较低(虽然我不鼓励担心,除非出现性能问题,因为DBMS应该比你或我更好地优化)。缺点是语义上过滤器不是真正一个连接条件,所以它有点hackish。
SELECT vp.name as 'Product', rp.quantity as 'quantity'
FROM Validproduct vp
Left JOIN RegistrationProduct rp on
vp.ValidproductID = rp.ValidproductID
and REGISTRATIONID = 1111
请注意,如果您想要多个REGISTRATION_ID,这通常无法正常工作,因为只有一个"无法匹配"将为每个有效产品记录生成记录。如果这是一个问题,您可能需要更多参与。