mysql - 检查表列的最大值,表列未知/常量

标签 mysql sql oracle

我在面试中被问到这个问题,我已经知道我们可以使用 CASE/oracle 的最大功能。 但是面试官想要一个答案,如果添加了新列,我们不必更改查询。 例如

Student English history maths 
zzzz    85      55     66
yyyy    47      99     55

预期结果:-

zzzzz English :85
yyyyy history :99

现在如果表被改变,相同的查询应该可以工作

Student English history maths science
zzzz    85      55       66    86
yyyy    47      99       55    11

预期结果:-

zzzzz science :86
yyyyy history :99

最佳答案

您可以使用 unpivot 在 Oracle 中获得答案:

SELECT *
FROM   (
  SELECT t.*,
         ROW_NUMBER() OVER ( PARTITION BY student ORDER BY total DESC ) AS rn
  FROM   your_table
  UNPIVOT ( total FOR subject IN ( english, maths, history ) ) t
)
WHERE  rn = 1;

但是您需要将新列名添加到 UNPIVOTIN 子句中。

但是,如果您要使用动态 SQL,那么您可以使用数据字典(即 USER_TAB_COLUMNS 表)构建那部分查询:

DECLARE
  column_names CLOB;
  sql          CLOB;
BEGIN
  SELECT LISTAGG(
           column_name,
           ','
         ) WITHIN GROUP ( ORDER BY column_id )
  INTO   column_names;
  FROM   user_tab_columns
  WHERE  table_name  = 'YOUR_TABLE'
  AND    column_name <> 'STUDENT';

  sql := 'SELECT * FROM ( SELECT t.*, ROW_NUMBER() OVER ( PARTITION BY student ORDER BY total DESC ) AS rn FROM your_table UNPIVOT ( total FOR subject IN ( ' || column_names || ' ) ) t ) WHERE  rn = 1;'

  EXECUTE IMMEDIATE sql;
END;
/

关于mysql - 检查表列的最大值,表列未知/常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45794932/

相关文章:

mysql - 在 MySQL 中创建事件不起作用

sql - 更改单个查询的 NLS_SORT

php - 向 PDO/MySql 语句添加辅助 WHERE 语句

mysql - 恰好加入 1 条记录,即使条件匹配多条记录

mysql - 哪个更快?插入还是更新?

sql - 从 Oracle SQL 中的当前日期减去 30 年

sql-server - 适用于 SQL Server 和 Oracle 的 LINQ to Entities

mysql - 我无法添加 'č' 'ř' 'ě'

sql - 每个用户 ID 的 first_value 和 last_value

sql - 外键可以提高查询性能吗?