我正在试图弄清楚如何有效地运行一组查询,这些查询将提供一个新表,其中包含将返回任意查询结果的所有值。
假设我的表有一个类似的架构:
列出所有会返回任意查询结果的值的有效方法是什么(例如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?如何有效地执行此操作以使操作在大型数据库上有时间限制?
希望澄清它。
答案 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
的记录时,您将使用
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
没有。