SQL查询以确定满足任意查询的所有值

时间:2012-09-27 09:31:56

标签: mysql

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

假设我的表有一个类似的架构:

  • 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?如何有效地执行此操作以使操作在大型数据库上有时间限制?

希望澄清它。

1 个答案:

答案 0 :(得分: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 Z的记录时,您将使用

查询distinctTable
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没有。