Common lisp clsql:为什么要“神奇地”添加表?

Common lisp clsql:为什么要“神奇地”添加表?,common-lisp,clsql,Common Lisp,Clsql,假设我有下面两张表 clsql:def视图类a类 字段1:整数类型 :db种类:键 :db约束:自动增量 字段2:类型字符串 :initarg:2 :db约束:非空 clsql:def视图类别b b-one:整数类型 :initarg:b-one :db种类:键 clsql:从类“class-a”创建视图 clsql:从类“class-b”创建视图 现在我想要a类的条目,但在b类中没有相应的条目。a.b-1类字段映射到b.b-1类字段的对应含义。假设a类有以下两个条目: clsql:从实例更新记

假设我有下面两张表

clsql:def视图类a类 字段1:整数类型 :db种类:键 :db约束:自动增量 字段2:类型字符串 :initarg:2 :db约束:非空 clsql:def视图类别b b-one:整数类型 :initarg:b-one :db种类:键 clsql:从类“class-a”创建视图 clsql:从类“class-b”创建视图 现在我想要a类的条目,但在b类中没有相应的条目。a.b-1类字段映射到b.b-1类字段的对应含义。假设a类有以下两个条目:

clsql:从实例更新记录使实例'class-a:two hello clsql:从实例更新记录使实例“class-a:两个世界” 因此,要发出的查询将是:

clsql:从[class-a]中选择'class-a:;b类被神奇地添加 :其中[不在[a类字段一] [选择[class-b-one]:从[class-b]中选择 :其中[=[a类字段一] [b-1类*.][]] 然而,这也增加了b类。由于一个故意的错误,我得到了如下执行的查询:

SELECT CLASS_A.FIELD_ONE,CLASS_A.FIELD_TWO FROM CLASS_A,CLASS_B 
  WHERE (NOT ((CLASS_A.FIELD_ONE 
                IN (SELECT CLASS_B.B_ONE FROM CLASS_B 
                      WHERE (CLASS_A.FIELD_ONE = CLASS_B.B_ONE)))))
另一方面,

clsql:从[class-a]中选择[*];见[*] :其中[不在[a类字段一] [选择[class-b-one]:从[class-b]中选择 :其中[=[a类字段一] [b-1类*.][]] 转换为预期的:

SELECT * FROM CLASS_A 
  WHERE (NOT ((CLASS_A.FIELD_ONE 
                IN (SELECT CLASS_B.B_ONE FROM CLASS_B 
                      WHERE (CLASS_A.FIELD_ONE = CLASS_B.B_ONE)))))

这是一个错误还是这种翻译背后有某种原因?

从6.7.0版开始,重新定义函数clsql sys::%tables for query使其按预期工作,而不会破坏我正在使用的webapp中的任何内容:

在包中:clsqlsys 从何处内部联接查询类的defun%表 声明忽略内部连接的位置 union mapcar“选择表sql expr类” 列出 但是我还没有运行测试用例clsql测试