当我写SQL queries,我发现自己经常想"有没有办法做到这一点与一个单一的查询"。当那发生时我经常把存储程序或多声明表值的功能,使用临时表(的一种或另一种),并结束了只合并的结果和返回的结果表。

我想知道如果有人知道,只是作为一个论的理论,无论它 应该 可以写任何查询,返回一个单一的结果设置为一个单一的查询(不多个发言).显然,我忽略相关的要点如码的可读性和易维护性,也许甚至可查询性的效率。这更多的是理论可以这样做...不用担心,我肯定不计划开始强迫我自己写的单声明,查询当多的发言将更好地满足我的目的在所有情况,但它可能使我认为两次或长一点上是否有一个可行的方式获得的结果从一个单一的查询。

我猜几个参数都在了-我在想一个关系数据库(例如,MS SQL)与表,按照共同的最佳做法(例如所有表格中具有主键等等)。

注:为了赢得'接受的回答上这个,你会需要提供一个明确的证据(参考网材料或类似的东西。)

有帮助吗?

解决方案

至少有一个新版本的Oracle绝对是可能的。它有一个模型条款',这使得sql图灵完成。( http://blog.schauderhaft.de/2009/06/18/building-a-turing-engine-in-oracle-sql-using-the-model-clause/ ).当然,这是所有与通常的限制,我们并不真正具有无限的时间和存储器中。

对于一个正常的sql dialect没有这些abdominations我不认为这是可能的。

一个任务,我看不出如何实现在'正常sql'将是:假定一个表格有一个单列的整型

对于每一排 '采取的值在当前行走,许多行后,获取这种价值,去,许多行回,并且继续下去,直到取同样值连续两次,并返回,作为的结果。'

其他提示

我相信这是可能的。我已经很难查询,很长的查询工作,并经常,可以使用单个查询做到这一点。但大多数时候,它很难十个分量,所以如果你有一个查询做到这一点,请务必仔细评论你的查询。点击

我从来没有遇到过的东西,不能在单个查询来完成。结果 但有时,最好做一个以上的查询。

我不能证明这一点,但我相信答案是肯定的谨慎 - 只要你的数据库设计得当。通常被迫写多个语句来得到某种结果是,你的架构可能需要一些改善的迹象。

我会说“是”,但无法证明。然而,我的主要思考过程:

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

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

  • 集合论应该保证它是可能的

其他想法:

  • 多个 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

在理论上是,如果使用的功能或OUTER APPLYs或子查询的曲折迷宫;然而,可读性和性能,我们始终结束了临时表和多语句存储手续。

如上面有人评论,这通常是你的数据结构开始闻到的标志;不,它的的的,但也许是时候由于性能原因(发生在我们最好的),以denormalise,也许在你的归一化“真实”的数据前加上去归一化查询层。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top