Путаница в получении нулевых значений с помощью соединений - PullRequest
0 голосов
/ 29 марта 2012

В базе данных есть две таблицы, скажем, table1 и table2 .. table1 имеет столбцы ip_address и application_name, тогда как table2 имеет столбцы, ip_address, avg_cpu, ram_utilization, date

Я хочу получить все ip_address, avg_cpu (среднее использование ЦП) на дату 2012-03-01, в которой хост-приложение 'my_system' ... если конкретный ip_address не имеет значения avg_cpu ... для этого 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 ]

1 голос
/ 29 марта 2012

Вы уверены, что вам нужно внешнее соединение?Если это так, то ваш запрос должен выглядеть следующим образом:

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 (это необходимо для соединений слева / справа, в противном случаеони работают как внутренние соединения)

1 голос
/ 29 марта 2012

Я уверен, что понимаю ваш вопрос, но звучит так, что вы, возможно, захотите попробовать «левое внешнее соединение», которое будет включать строки, для которых предикат соединения НЕ совпадает ... в этом случае значения из правая сторона объединения будет NULL

0 голосов
/ 29 марта 2012

Если я правильно понимаю ваши потребности, я думаю, что это сработает:

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 было неверным.http://wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOIN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...