Sql 从与具有多个相关记录的子表相关的表中仅返回1个值

Sql 从与具有多个相关记录的子表相关的表中仅返回1个值,sql,sql-server,Sql,Sql Server,表A包含一个与表B相关的ID。表B还包含一个与表C相关的ID。我需要弄清楚如何根据表外定义的层次结构仅返回一个值。 例如: 表A(设备) 表B(翻译表) 表C(价值表) 我需要评估表a中的每个ID,如果它有一个相关的高值(789),我需要返回高值,如果没有,如果是相关的高值,那么我需要检查它是否与中值相关。如果设备与高值无关,但与MED值相关,则返回MED。最后,对LOW做同样的事情。没有值的设备不需要返回。 期望输出 ------------------------------ |___Dev

表A包含一个与表B相关的ID。表B还包含一个与表C相关的ID。我需要弄清楚如何根据表外定义的层次结构仅返回一个值。 例如: 表A(设备)

表B(翻译表)

表C(价值表)

我需要评估表a中的每个ID,如果它有一个相关的高值(789),我需要返回高值,如果没有,如果是相关的高值,那么我需要检查它是否与中值相关。如果设备与高值无关,但与MED值相关,则返回MED。最后,对LOW做同样的事情。没有值的设备不需要返回。 期望输出

------------------------------
|___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