Sql 从与具有多个相关记录的子表相关的表中仅返回1个值
表A包含一个与表B相关的ID。表B还包含一个与表C相关的ID。我需要弄清楚如何根据表外定义的层次结构仅返回一个值。 例如: 表A(设备) 表B(翻译表) 表C(价值表) 我需要评估表a中的每个ID,如果它有一个相关的高值(789),我需要返回高值,如果没有,如果是相关的高值,那么我需要检查它是否与中值相关。如果设备与高值无关,但与MED值相关,则返回MED。最后,对LOW做同样的事情。没有值的设备不需要返回。 期望输出Sql 从与具有多个相关记录的子表相关的表中仅返回1个值,sql,sql-server,Sql,Sql Server,表A包含一个与表B相关的ID。表B还包含一个与表C相关的ID。我需要弄清楚如何根据表外定义的层次结构仅返回一个值。 例如: 表A(设备) 表B(翻译表) 表C(价值表) 我需要评估表a中的每个ID,如果它有一个相关的高值(789),我需要返回高值,如果没有,如果是相关的高值,那么我需要检查它是否与中值相关。如果设备与高值无关,但与MED值相关,则返回MED。最后,对LOW做同样的事情。没有值的设备不需要返回。 期望输出 ------------------------------ |___Dev
------------------------------
|___Device Name___|___COST___|
------------------------------
|___Server1_______|___HIGH___|
------------------------------
|___Server2_______|___MED____|
------------------------------
我将如何为该信息的查询设置权限,特别是如果值ID可能更改的话
select a.*,
coalesce(
(select C.value from C, B
where c.Value = 'HIGH'
and b.ValueID = c.ValueID
and b.DeviceID = a.DeviceID),
(select C.value from C, B
where c.Value = 'MED'
and b.ValueID = c.ValueID
and b.DeviceID = a.DeviceID),
(select C.value from C, B
where c.Value = 'LOW'
and b.ValueID = c.ValueID
and b.DeviceID = a.DeviceID)
) Value
from a
where exists (select null from C,B
where b.ValueID = c.ValueID
and b.DeviceID = a.DeviceID)
合并将返回第一个非空值,该值可能满足您的需求。根据您的输入和所需的输出,以下查询可能会给出所需的结果:
select a.DeviceName, c.Value
from TableA a inner join TableB b
on a.DeviceID=b.DeviceID
inner Join TableC c
on b.ValueID=c.ValueID
大家好,欢迎来到SO。你能发布一些消耗性数据和期望的输出吗?这是一个很好的起点。搜索
groupby
(为了方便起见,请阅读SQL手册/教程!):)groupbyworks,但每个设备都有多个值。你如何告诉它把“HIGH”带回到“MED”之上?你可以用SQL FIDLE上的一些示例数据创建你的模式。这很有效。我确实需要在coalesce的select语句周围添加括号,而且效果非常好!谢谢分享!!!比他想要的还要多,不是吗?他会很高兴的;-)
------------------------------
|___Device Name___|___COST___|
------------------------------
|___Server1_______|___HIGH___|
------------------------------
|___Server2_______|___MED____|
------------------------------
select a.*,
coalesce(
(select C.value from C, B
where c.Value = 'HIGH'
and b.ValueID = c.ValueID
and b.DeviceID = a.DeviceID),
(select C.value from C, B
where c.Value = 'MED'
and b.ValueID = c.ValueID
and b.DeviceID = a.DeviceID),
(select C.value from C, B
where c.Value = 'LOW'
and b.ValueID = c.ValueID
and b.DeviceID = a.DeviceID)
) Value
from a
where exists (select null from C,B
where b.ValueID = c.ValueID
and b.DeviceID = a.DeviceID)
select a.DeviceName, c.Value
from TableA a inner join TableB b
on a.DeviceID=b.DeviceID
inner Join TableC c
on b.ValueID=c.ValueID