我有这样的表:
id col1 col2
1   a    55
2   b    77
结果我想看到:
id col1 col2 MIN(col2)
1   a    55   55
2   b    77
类似的东西,或者在其他情况下,我如何获得整个表格的一个最小值。
您可以将 a与子查询一起使用,该子查询将为整个表CROSS JOIN选择值:min(col2)
select t1.id, 
  t1.col1, 
  t1.col2, 
  t2.minCol2
from yourtable t1
cross join
(
  select min(col2) minCol2
  from yourtable
) t2
如果要将其扩展为仅显示min(col2)第一行的值,则可以使用用户定义的变量:
select id,
  col1, 
  col2,
  case when rn = 1 then mincol2 else '' end mincol2
from
(
  select t1.id, 
    t1.col1, 
    t1.col2, 
    t2.minCol2,
    @row:=case when @prev:=t1.id then @row else 0 end +1 rn,
    @prev:=t1.id
  from yourtable t1
  cross join
  (
    select min(col2) minCol2
    from yourtable
  ) t2
  cross join (select @row:=0, @prev:=null) r
  order by t1.id
) d
order by id
如果您有多个要比较的列,则可以使用查询取消透视UNION ALL数据,然后选择min结果的值:
select t1.id, 
  t1.col1, 
  t1.col2, 
  t2.MinCol
from yourtable t1
cross join
(
  select min(col) MinCol
  from
  (
    select col2 col
    from yourtable
    union all
    select col3
    from yourtable
  ) src
) t2
你不能。列数是固定的,因此您可以获得@bluefeet 描述的所有行的最小值。
您可以使用以下逻辑在较少的行数(通常为 1)上获取它:
(case when t2.minCol2 = t1.col2 then t2.minCol2 end)
但这会将 NULL 放在其他行上。