使用连接检索空值时的困惑

时间:2012-03-29 17:53:47

标签: mysql sql database join

数据库中有两个表,如table1和table2 .. table1有列ip_address和application_name,而table2有列,ip_address,avg_cpu,ram_utilization,date

我想检索主机应用程序'my_system'的日期2012-03-01的所有ip_address,avg_cpu(平均cpu利用率)...如果特定的ip_address没有avg_cpu值... null应该是为ip_address返回..我应该对下面的查询进行哪些修改以获得预期的结果...我很困惑,因为这是我第一次加入

SELECT 
  `table1`.`ip_address`,
  `table1`.`application`,
  `table2`.`avg_cpu`
from  
  `table1`
   right outer join `table2` ON `table1`.`ip_address`=`table2`.`ip_address`
where
   `table2`.`date`='2012-03-01'
    and `table1`.`application`='My_System'

3 个答案:

答案 0 :(得分:1)

我确定我是否理解你的问题,但听起来你可能想尝试“左外连接”,其中包括连接谓词不匹配的行......在这种情况下,来自连接的右侧将为NULL

答案 1 :(得分:1)

您确定需要外部联接吗?如果是这样,那么您的查询应如下所示:

SELECT 
  `table1`.`ip_address`,
  `table1`.`application`,
  `table2`.`avg_cpu`
from  
  `table1`
   left join `table2` ON `table1`.`ip_address`=`table2`.`ip_address` and `table2`.`date`='2012-03-01'
where
  `table1`.`application`='My_System'

请注意,我更改了左连接的rigth连接,并将table2条件移动到ON部分(这是左/右连接所必需的,否则它们用作内部连接)

答案 2 :(得分:0)

如果我理解你的需要,我认为这会有效:

SELECT
   `table1`.`ip_address`,
   `table1`.`application`,
   `table2`.`avg_cpu` 
FROM     `table1`    
LEFT OUTER JOIN `table2` 
    ON `table1`.`ip_address`=`table2`.`ip_address` 
        AND `table2`.`date`='2012-03-01'     
WHERE `table1`.`application`='My_System' 

LIke @RyanHenning,我认为你的意思是左连接而不是右连接,所以我相应地调整了代码。请注意,即使您在原始文本中使用了右外连接,但实际上没有外连接,因为您将特定条件放在连接左侧的表必须满足的where clasue中。我也认为您可能会发现此链接有助于理解where子句不正确的原因。 http://wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOIN