我尝试创建一个SQL查询,该查询使用一个表来计算我们公司在每个机箱中的刀片服务器数量,并将这些服务器分组,同时将其与另一个表中的机箱信息相连接。
但是,其中一个机箱中没有刀片,因此刀片库存表中不会显示该名称。使用INNER JOIN创建一个表格,该表格不包含任何容量的刀片。 LEFT JOIN实现了相同的效果,但是RIGHT JOIN为我提供了一个额外的行,其机箱名称为空值。
我猜这是因为第一个表中不存在该刀片名称优先于第二个,但不确定如何纠正。截至目前,我的查询看起来像这样:
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个刀片的机箱名称来编辑它?
答案 0 :(得分:1)
只需从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#;
答案 1 :(得分:0)
您也可以使用以下代码,使用更简单有效的案例
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