【问题标题】:Why does the IN Statement within the PIVOT clause has to be static为什么 PIVOT 子句中的 IN 语句必须是静态的
【发布时间】:2019-09-02 13:49:26
【问题描述】:

每次我在 SQL 中使用 pivot 子句时,我都想知道为什么 IN 语句必须是静态的,我需要编写类似 'A', 'B' 的东西。

SELECT *
FROM
(
    SELECT key_1, column_name, value_1
    FROM table_1
)
PIVOT
(
    MAX(column_name)
    FOR column_name in('A', 'B')
)

是否有技术原因不允许写类似

的东西
SELECT *
FROM
(
    SELECT key_1, column_name, value_1
    FROM table_1
)
PIVOT
(
    MAX(column_name)
    FOR column_name in(SELECT value_1 FROM table_2)
)

因为编写 IN 动态查询显然要舒服得多。

感谢您的回答!

【问题讨论】:

  • 一般情况下,SQL 查询需要明确指定其列。如果您需要更大的灵活性,您可以使用动态 SQL。

标签: sql oracle pivot


【解决方案1】:

SQL 查询必须返回一组固定的列,这是 SQL 中的一个常见要求。您基本上应该事先知道您的查询将返回多少列。

请记住,对于任何数据库 API,运行 SQL 查询时执行的第一步是准备语句。此操作生成一个返回给客户端的语句处理程序,它可以使用它来分配稍后将存储查询结果的数据结构。由于可以使用不同的绑定值执行相同的语句,这意味着给定的查询应该始终返回相同的、固定数量的列。

【讨论】:

  • 你好专线小巴,我接受。听起来可以理解。我在互联网上搜索了有关数据库在这一步中到底做了什么的详细信息,但没有找到任何东西。你能给我一个链接以获取更多信息吗?那太好了!
  • @ReneMoch:我建议阅读以下内容:community.oracle.com/thread/2422880?tstart=2
【解决方案2】:

我会将您的第一个数据透视查询重写为更有意义的内容:

SELECT *
FROM
(
    SELECT key_1, column_name
    FROM table_1
)
PIVOT
(
    COUNT(column_name)
    FOR column_name in('A', 'B')
)

这个查询在逻辑上等价于:

SELECT
    key_1,
    COUNT(CASE WHEN column_name = 'A' THEN column_name END) AS a_count,
    COUNT(CASE WHEN column_name = 'B' THEN column_name END) AS b_count
FROM table_1
GROUP BY
    key_1;

通过允许PIVOT 查询的IN 子句成为动态结果集,将不再可能使用静态 SQL 语法来表达查询。相反,它需要动态 SQL。虽然当然可以使用动态 SQL 来满足您的需求,但 PIVOT 运算符不支持它。

【讨论】:

    猜你喜欢
    • 2018-03-08
    • 2013-10-02
    • 2014-05-27
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多