如何检查SQL SELECT查询是否是其他查询的子集

时间:2016-04-25 00:06:00

标签: sql select

我试图找到一种方法来确定SQL SELECT查询 A 是否容易返回另一个查询 B 返回的结果的子集。此外,这需要仅从查询中完成,而无需访问相应的结果集。

例如,查询SELECT * from employee WHERE salary >= 1000将返回查询SELECT * from employee的结果的子集。我需要找到一种自动方式来执行任何两个查询 A B 的验证,而无需访问存储数据的数据库。

如果在没有RDBMS的帮助下实现这一目标是不可行的,我们可以假设我可以访问本地但空的RDBMS,但数据存储在其他地方。此外,必须使用算法或库在代码中完成此检查。我使用的语言是Java,但其他语言也可以。

非常感谢提前。

2 个答案:

答案 0 :(得分:0)

我不知道你想要深入解析查询的深度,但基本上你可以说有两种一般的方法来制作一个查询的子集(假设源表和投影(选择)保持不变相同):

  • 使用where子句将条件添加到行值
  • 使用having子句向聚合值添加条件

所以你可以说,如果你有两个代表查询的对象,并说它们看起来很接近这个:

 {
    'select': { ... },
    'from': {},
    'where': {},
    'orderby': {}
 }

他们selectfromorderby是相同的,但是在where子句中有一个额外的条件,你有一个子集。

答案 1 :(得分:0)

您可以通过检查其源表来确定查询是否是另一个查询的子集的一种方法。如果您无法访问数据本身,这可能会非常棘手。此问题引用了使用Snowflake连接基于查询生成数据库图表而无需访问数据本身:

Generate table relationship diagram from existing schema (SQL Server)

如果您的查询不超过800个字符,该工具可以免费使用:https://snowflakejoins.com/index.html

我使用AdventureWorks数据库和这两个查询对其进行了测试:

SELECT * FROM HumanResources.Employee

SELECT * FROM HumanResources.Employee WHERE EmployeeID< 200

当我将它们插入Snowflake Joins文本编辑器时,这就是生成的内容:

SnowflakeJoins DB Diagram example

希望有所帮助。