数据库中有两个表,如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'
答案 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