-
Notifications
You must be signed in to change notification settings - Fork 0
SQLGraphExplorer‐9
Xin edited this page Dec 26, 2023
·
3 revisions
针对每一个源表,生成一个 procedure,其参数是 tuple
- 将表别名的映射关系抽象成 TableAlias 类,并交给 Tools 工具箱管理
- 之前不支持表别名,会将条件中的表别名识别为不是该表,从而发生错误的消除
- 目前通过 TableAlias 可以进行正确识别
增加了重复律的简化:B AND/OR B -> B
CASE 不包含在 Relational Algebra 中(找不到 CASE 对应的 RA 表示),所以该如何 inverse case 呢?
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
WHEN conditionN THEN resultN
ELSE result
END;SELECT
A.A1 AS C1
CASE
WHEN A.A2 = '0101' THEN B.B1
ELSE B.B2
END AS C2 /* case_expression */
FROM
A JOIN B原来的 projection 只能选择“一个”列,而 case_expression 的存在会导致多个列(在满足对应条件的情况下)被映射到一个目标 rename 列的情况(多对一)。
那么我尝试进行 inverse 推导(下面的推导结果有误):
在推导过程中,由于 case 的存在引入了以下问题:
- case 的出现,导致了 c2 在 rename 的逆运算过后,其对应 schema 是两个(B.B1 & B.B2)
- 我在推导过程中,将 case 中的条件放入了 Constraint 中,但是 case 中的条件的“作用域”仅限于 C2,不应影响 C1。这导致结果中不应含有该条件
sql 中有许多函数可供调用,假设我们有函数 add(a,b)
SELECT
ADD(A.A1,B.B1) AS C1
FROM
A JOIN B同样尝试进行 inverse 推导:
存在问题如下:
- 想要进行函数求逆,我们需要直到该函数的语义,并求出其精确的逆函数。
- 我们只有目标表中的结果 tuple(c1),但我们还需要其他表的某一列的所有值,从而推导出 c1 对应的所有可能值。这就类似于论文中的 difference 问题了。