【问题标题】:SQL: Get Value of Column in table 1 from table 2SQL:从表 2 中获取表 1 中列的值
【发布时间】:2017-04-25 10:00:36
【问题描述】:
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

我试过了,但它只给了我注册产品中存在的产品

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

【问题讨论】:

  • Left JOIN RegistrationProduct rp on vp.ValidproductID = rp.ValidproductID AND rp.REGISTRATIONID = 1111
  • where 更改为AND,以便在加入之前应用过滤器。 where 子句出现在连接之后,并从左连接中消除空记录;实际上使左连接成为内部连接。
  • 您的 where 子句将外连接变为内连接。在连接的 on 子句中包含条件。

标签: sql select join left-join


【解决方案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

【讨论】:

  • 实际上,这正是我所需要的以及“COALESCE(rp.quantity, 0)。谢谢。它起作用了
【解决方案2】:

您的查询的问题是您的 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 的数量。使用空合并表达式产生零:

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

【讨论】:

  • 很棒的人。像魅力一样工作。 :-)
  • @HoneyBadger 它解决了我的问题,但我会选择 Mureinik 的答案,因为我意识到我也需要 COALESCE(rp.quantity, 0) 但是非常感谢。
【解决方案3】:

应用于左连接或右连接的 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

【讨论】:

  • 谢谢老板。我得到了解决方案
【解决方案4】:

当“右”表中没有匹配记录时,左连接会生成一个连接记录,其中“右”表中的所有列都具有 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,这通常不会正常工作,因为每个有效产品记录只会生成一个“不匹配”记录。如果这是一个问题,您可能需要更多的参与。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 2013-02-19
    • 2021-09-07
    • 2017-05-08
    相关资源
    最近更新 更多