Соединение SQL со значением, отсутствующим в одном столбце

Я пытаюсь создать SQL-запрос, который использует одну таблицу для подсчета количества блейд-серверов, которые наша компания имеет в каждом шасси, и группирует их, объединяя его с информацией о шасси из другой таблицы.

Однако в одном из шасси нет лезвий, поэтому имя не отображается в таблице инвентаря лезвий. Использование ВНУТРЕННЕГО СОЕДИНЕНИЯ создает таблицу, которая не содержит этого блейда ни в каком качестве. ЛЕВОЕ СОЕДИНЕНИЕ дает тот же эффект, но ПРАВОЕ СОЕДИНЕНИЕ дает мне дополнительную строку с нулевым значением для имени шасси.

Я предполагаю, что это связано с тем, что отсутствие этого имени блейда в первой таблице имеет приоритет над второй, но не уверен, как это исправить. Мой запрос на данный момент выглядит так:

SELECT e.EnclosureName, e.PDUName, q.Blades, r.Serial#
  FROM bladeinventory.table e JOIN
(
    SELECT EnclosureName,COUNT(*) Blades 
      FROM bladeinventory.table
      GROUP BY EnclosureName
) q ON e.EnclosureName = q.EnclosureName
LEFT JOIN chassisinventory.table r
ON e.EnclosureName = r.EnclosureName
GROUP BY e.EnclosureName, e.PDUName, q.Blades, r.Serial#

Можно ли отредактировать это таким образом, чтобы запрос действительно генерировал имя шасси с 0 лезвиями?


person Justin    schedule 05.11.2014    source источник
comment
Итак, SQL Server или MySQL?   -  person Lamak    schedule 05.11.2014
comment
И как только вы ответите на этот вопрос, и если хотите, рассмотрите следующий простой двухэтапный план действий: 1. Если вы еще этого не сделали, предоставьте правильные DDL (и/или sqlfiddle), чтобы мы могли больше легко воспроизвести проблему. 2. Если вы еще этого не сделали, укажите желаемый набор результатов, соответствующий информации, предоставленной на шаге 1.   -  person Strawberry    schedule 05.11.2014
comment
Как упоминалось Strawberry: создайте sqlfiddle ( sqlfiddle.com )   -  person ashiaka    schedule 05.11.2014
comment
Извините, это SQL-сервер. Я попытаюсь создать SQLfiddle как можно скорее, просто решая несколько проблем на данный момент. Спасибо за ваше время, ребята.   -  person Justin    schedule 05.11.2014


Ответы (2)


Просто вытащите имя из таблицы chassisinventory. Я буду использовать coalesce() на тот случай, если вы поменяете порядок join (снова):

SELECT COALESCE(r.EncloseName, e.EnclosureName) as EnclosureName, e.PDUName, q.Blades, r.Serial#
FROM bladeinventory.table e JOIN
     (SELECT EnclosureName,COUNT(*) Blades 
      FROM bladeinventory.table
      GROUP BY EnclosureName
     ) q
     ON e.EnclosureName = q.EnclosureName LEFT JOIN
     chassisinventory.table r
     ON e.EnclosureName = r.EnclosureName
GROUP BY COALESCE(r.EncloseName, e.EnclosureName), e.PDUName, q.Blades, r.Serial#;
person Gordon Linoff    schedule 05.11.2014
comment
К сожалению, этот код представил исходную проблему в моей. Шасси без блейд-серверов в таблице отсутствует. Тем не менее, спасибо за ваш ответ! - person Justin; 05.11.2014
comment
@Джастин. . . Просто измените left join на right join или поставьте таблицу первой в ряду left joins. - person Gordon Linoff; 05.11.2014
comment
Аргх, конечно! Я пробовал этот и другой ответ одновременно, и это приблизилось к летучей мыши, поэтому я работал там, не переключая соединение. Все еще работаю над тем, чтобы запомнить, как все эти типы соединения работают вместе. Спасибо большое! - person Justin; 05.11.2014

Вы также можете использовать приведенный ниже код, где используется регистр, который намного проще и эффективнее.

SELECT e.EnclosureName, r.PDUName, 
case when q.Blades IS NULL then 0 
else q.Blades end Blades, 
e.Serial#
FROM chassisinventory.table e
LEFT OUTER JOIN bladeinventory.table r on e.EnclosureName = r.EnclosureName
LEFT OUTER JOIN (SELECT EnclosureName,COUNT(*) Blades 
  FROM bladeinventory.table
  GROUP BY EnclosureName
) q on e.EnclosureName = q.EnclosureName
person Bikash Pradhan    schedule 05.11.2014
comment
Это очень похоже на то, что он включает в себя отсутствующее шасси, однако есть что-то не так с тем, как он группирует вещи, и каждое шасси повторяется для стольких лезвий, сколько в них есть. Я работаю с этим кодом, чтобы попытаться создать желаемый результат. Спасибо за вашу помощь! - person Justin; 05.11.2014
comment
@Justin Можете ли вы дать мне представление о том, как должно выглядеть o/p? т. е. будет ли когда-либо имя Encloser из шасси присутствовать в лезвии или нет? - person Bikash Pradhan; 06.11.2014