SQL:从表2中获取表1中的列值

时间:2016-12-09 20:47:57

标签: sql select join left-join

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

4 个答案:

答案 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,这通常无法正常工作,因为只有一个"无法匹配"将为每个有效产品记录生成记录。如果这是一个问题,您可能需要更多参与。