2

我试图弄清楚如何有效地运行一组查询,这些查询将提供一个包含所有值的新表,这些值将返回任意查询的结果。

假设我的表具有如下架构:

  • ID
  • 姓名
  • 年龄
  • 城市

列出所有将返回任意查询结果的值(例如,SELECT * FROM main WHERE NOT city=X AND age BETWEEN Y AND Z)的有效方法是什么?

我对此的天真方法是使用脚本并通过 {city, age, age} 的所有可能组合进行递归,并查看哪些 SELECT 返回超过 0 个结果,但这似乎非常低效。我也尝试过在 {city, age, age} 上构建大型连接,并且基本上使用该表作为查询的参数列表,但这很快就成为不可能对许多列进行查询。

对于简单的连接相等查询(例如,SELECT * FROM main WHERE name=X AND age=Y),这要简单得多,因为我可以执行以下操作:

SELECT name, age, count(*) AS count FROM main GROUP BY name, age HAVING count > 0

但是我很难为比这更复杂的事情想出一个通用的方法。

任何指向正确方向的指针都会非常有帮助,谢谢。

编辑:

看来我在解释这一点上做得很糟糕,对不起。

想象一下,一个用户给了我一个数据库和一个模板查询并说:“告诉我我可以在这个查询中使用的所有值,这些值将从这个数据库中产生结果。” 例如,用户可能想知道将返回至少一行的所有年龄范围查询(例如,模板查询是SELECT * FROM main WHERE age BETWEEN X AND Y)。

在该特定示例中,可以运行 SELECT 以查找数据库中的最小/最大年龄,并告诉用户在这些年龄之间进行查询。

现在假设查询模板更复杂,例如SELECT * FROM main WHERE NOT city=W AND age BETWEEN X AND Y AND name LIKE Z. 如何确定可用于此查询以返回结果的 W/X/Y/Z 值的范围?它是否需要使用每个 {city, age, age, name} 组合创建一个连接表并在每一行上运行 SELECT?我怎样才能有效地做到这一点,以便操作在大型数据库上是有时间限制的?

希望这能澄清它。

4

1 回答 1

0

您可以尝试在插入表后编写一个触发器,如果​​值不存在,则将它们插入到另一个表中。这样,您将拥有一个包含表的不同值的表。这张桌子看起来像

 columnNameFromYourTable  |  distinctValue
 city                        NY
 city                        LA
 age                         1
 age                         2
 ...

然后,当您想知道表中是否存在用于查询的记录时,您可以使用以下方式查询SELECT * FROM main WHERE NOT city=W AND age BETWEEN X AND Y AND name LIKE ZdistinctTable

select 1 from dual where 1=1
and not exists (select 1 from distinctTable where columnNameFromYourTable = 'city' and distinctValue = 'W')
and exists (select 1 from distinctTable where columnNameFromYourTable = 'age' and distinctValue BETWEEN X AND Y)
and exists (select 1 from distinctTable where columnNameFromYourTable = 'name' and distinctValue LIKE '%Z%')

这将是相当快的。如果它返回1,则表中有一个条目,否则NULL

于 2012-09-27T11:45:12.587 回答