SQL查询理论问题 - 单语句与多语句查询

时间:2010-01-06 18:36:58

标签: sql theory relational-algebra database-theory

当我编写SQL查询时,我发现自己常常认为“单一查询无法做到这一点”。当发生这种情况时,我经常转向使用临时表(一种或另一种)的存储过程或多语句表值函数,最后简单地组合结果并返回结果表。

我想知道是否有人知道,仅仅作为一个理论问题,是否应该可以编写任何查询,将单个结果集作为单个查询(而不是多个语句)返回。显然,我忽略了代码可读性和可维护性等相关点,甚至可能是查询性能/效率。这更多是关于理论的 - 它可以做到......而且不用担心,当多语句在所有情况下更适合我的目的时,我当然不打算开始强迫自己编写单语句查询,但是它可能会让我思考是否有一个可行的方法来从单个查询获得结果。

我想一些参数是有序的 - 我正在考虑一个关系数据库(例如MS SQL),其中的表遵循常见的最佳实践(例如所有具有主键的表等等)。

注意:为了赢得“接受的答案”,您需要提供明确的证明(参考网络资料或类似内容。)

5 个答案:

答案 0 :(得分:3)

我相信这是可能的。我使用了非常困难的查询,非常长的查询,并且通常可以使用单个查询来完成。但大多数时候,它很难保持,所以如果你只用一个查询来做,请确保你仔细评论你的查询。

我从来没有遇到过在单个查询中无法完成的事情 但有时最好在多个查询中执行此操作。

答案 1 :(得分:2)

我无法证明这一点,但我相信答案是谨慎的 - 只要您的数据库设计正确完成。通常被迫编写多个语句来获得某个结果,这表明您的模式可能需要一些改进。

答案 2 :(得分:2)

我会说“是”但不能证明这一点。但是,我的主要思想过程是:

  • 任何选择都应该是基于集合的操作

  • 您的假设是您正在处理数学上正确的集合(即正确规范化)

  • 集合理论应该保证可能

其他想法:

  • 多个SELECT语句经常加载临时表/表变量。这些可以在CTE中导出或分离。

  • 任何RBAR处理(好的或坏的)现在都应用CROSS / OUTER APPLY处理到派生表

  • 在这种情况下,UDF会被归类为“作弊”,因为它允许您将SELECT放入另一个模块而不是单个模块

  • 在DML的“之前”序列中不允许写入:这会将状态从SELECT更改为SELECT

  • 您是否在我们的商店看到了一些代码?

编辑,词汇表

编辑:申请:作弊?

SELECT
    *
FROM
    MyTable1 t1
    CROSS APPLY
    (
        SELECT * FROM MyTable2 t2
        WHERE t1.something = t2.something
    ) t2

答案 3 :(得分:2)

至少使用最新版本的Oracle是绝对可能的。它有一个'model clause',它使sql turing完整。 (http://blog.schauderhaft.de/2009/06/18/building-a-turing-engine-in-oracle-sql-using-the-model-clause/)。当然,这是通常的限制,我们实际上没有无限的时间和记忆。

对于没有这些abdominations的普通sql方言,我认为不可能。

我无法看到如何在'普通sql'中实现的任务将是: 假设一个表具有整数

类型的单列

对于每一行 '获取当前行的值并返回那么多行,获取该值,返回那么多行,然后继续,直到你连续两次获取相同的值并返回结果。'

答案 4 :(得分:1)

理论上是的,如果您使用外部应用或子查询的功能或曲折的迷宫;但是,为了便于阅读和性能,我们总是最终使用临时表和多语句存储过程。

如上所述,这通常表明您的数据结构已经开始嗅到;并不是说它是,但也许是因为性能原因(在我们最好的情况下发生)进行非规范化,或者可能在规范化的“真实”数据前放置一个非规范化的查询层。