我试图找到一种方法来确定 SQL SELECT 查询 A 是否容易返回另一个查询 B 返回的结果的子集。此外,这需要单独通过查询来完成,而无需访问相应的结果集。
例如,查询
SELECT * from employee WHERE salary >= 1000
将返回查询 SELECT * from employee
结果的子集。我需要找到一种自动化方法来对任意两个查询 A 和 B 执行此验证,而无需访问存储数据的数据库。
如果在没有 RDBMS 的帮助下无法实现这一点,我们可以假设我可以访问本地但空的 RDBMS,但数据存储在其他地方。此外,此检查必须使用算法或库在代码中完成。我使用的语言是Java,但其他语言也可以。
提前非常感谢。
我不知道你想深入解析查询多深,但基本上你可以说有两种制作查询子集的通用方法(假设源表和投影(选择)保持不变):
所以你可以说,如果你有两个代表查询的对象,并说它们看起来与此接近:
{
'select': { ... },
'from': {},
'where': {},
'orderby': {}
}
并且它们的
select
、from
和 orderby
是相同的,但其中一个在 where
子句中有额外的条件,你有一个子集。
确定一个查询是否是另一个查询的子集的一种方法是检查它们的源表。如果您无权访问数据本身,这可能会很棘手。这个问题引用了使用雪花连接根据查询生成数据库图表,而无需访问数据本身:
如果您的查询不超过 800 个字符,则可以免费使用该工具:https://snowflakejoins.com/index.html
我使用 AdventureWorks 数据库和这两个查询对其进行了测试:
从 HumanResources.Employee 中选择 *
从 HumanResources.Employee 中选择 *,其中 EmployeeID < 200
当我将它们都插入 Snowflake Joins 文本编辑器时,生成的内容如下:
希望有帮助。
在没有数据的情况下,确定 SQL 查询 A 是否返回查询 B 的子集可能会很复杂。 ER/Studio 的全面数据建模和 SQL 分析工具可以通过提供模式见解、约束和关系来提供帮助。这些可以以编程方式用于推断子集关系。 ER工作室