Mysql 一列中缺少值的SQL联接
我正在尝试创建一个SQL查询,该查询使用一个表来计算我们公司在每个机箱中拥有的刀片服务器数量,并将这些服务器分组,同时将其与另一个表中的机箱信息连接起来 但是,其中一个机箱中没有刀片,因此该名称不会显示在刀片资源清册表中。使用内部联接将创建一个不包含任何容量的刀片的表。左连接实现了相同的效果,但右连接为我提供了一个额外的行,其中机箱名称的值为null 我猜这是因为第一个表中不存在的刀片名称优先于第二个表,但不确定如何更正。到目前为止,我的查询如下所示:Mysql 一列中缺少值的SQL联接,mysql,sql-server,join,Mysql,Sql Server,Join,我正在尝试创建一个SQL查询,该查询使用一个表来计算我们公司在每个机箱中拥有的刀片服务器数量,并将这些服务器分组,同时将其与另一个表中的机箱信息连接起来 但是,其中一个机箱中没有刀片,因此该名称不会显示在刀片资源清册表中。使用内部联接将创建一个不包含任何容量的刀片的表。左连接实现了相同的效果,但右连接为我提供了一个额外的行,其中机箱名称的值为null 我猜这是因为第一个表中不存在的刀片名称优先于第二个表,但不确定如何更正。到目前为止,我的查询如下所示: SELECT e.EnclosureNam
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个刀片的机箱的名称实际上是通过查询生成的?只需从
chassisinventory
表中提取名称即可。我将使用coalesce()
,以防您(再次)切换连接的顺序:
您还可以在使用case的情况下使用下面的代码,这将更加简单和有效
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
那么,SQL Server还是MySQL?一旦你回答了这个问题,如果你愿意,考虑下面这个简单的两步过程:1。如果您还没有这样做,请提供适当的DDL(和/或SQLFIDLE),以便我们可以更轻松地复制问题。2.如果您还没有这样做,请提供与步骤1中提供的信息相对应的所需结果集。如上文所述:请创建一个sqlfiddle()。对不起,这是SQL server。我将尝试尽快创建一个SQLFIDLE,目前只处理多个问题。谢谢你们的时间,伙计们。不幸的是,这段代码提出了我的原始问题。表中不存在没有刀片的机箱。不过,谢谢您的回复@贾斯汀。只需将left join
更改为right join
,或者将表作为一系列left join
中的第一个!我同时尝试了这个答案和另一个答案,结果差一点,所以我在那里工作,没有切换连接。仍在努力记住所有这些连接类型是如何一起工作的。非常感谢!这一点非常接近,因为它确实包含了丢失的机箱,但是它的分组方式和每个机箱重复使用的刀片数量都有问题。我正在从这段代码中尝试并创建所需的结果。谢谢你的帮助@贾斯汀你能告诉我o/p应该是什么样子吗?i、 e.刀片服务器中是否存在机箱中的封闭器名称?
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