首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >clsql:为什么要“神奇地”添加表?

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

Stack Overflow用户
提问于 2019-10-05 16:10:45
回答 1查看 192关注 0票数 2

假设我有以下两个表

代码语言:javascript
复制
(clsql:def-view-class class-a ()
  ((field-one :type integer
              :db-kind :key
              :db-constraints :auto-increment)
   (field-two :type string
              :initarg :two
              :db-constraints :not-null)))

(clsql:def-view-class class-b ()
  ((b-one :type integer
          :initarg :b-one
          :db-kind :key)))

(clsql:create-view-from-class 'class-a)
(clsql:create-view-from-class 'class-b)

现在我需要a类的条目,这些条目在b类中没有对应的条目。(“对应”表示class-a.field-one映射到class-b.b-one。)假设a类有以下两个条目:

代码语言:javascript
复制
(clsql:update-records-from-instance (make-instance 'class-a :two "hello"))
(clsql:update-records-from-instance (make-instance 'class-a :two "world"))

因此,要发出的查询将是:

代码语言:javascript
复制
(clsql:select 'class-a :from [class-a] ; class-b is added "magically"
              :where [not [in [class-a field-one]
                              [select [class-b b-one] :from [class-b]
                                      :where [= [class-a field-one]
                                                [class-b b-one]]]]])

然而,这也增加了class-b。(有了一个故意的错误,我得到的查询执行如下:)

代码语言:javascript
复制
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)))))

另一方面,

代码语言:javascript
复制
(clsql:select [*] :from [class-a] ; see the [*]
              :where [not [in [class-a field-one]
                              [select [class-b b-one] :from [class-b]
                                      :where [= [class-a field-one]
                                                [class-b b-one]]]]])

被翻译成预期的:

代码语言:javascript
复制
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)))))

这是一个bug,还是这个翻译背后有什么原因?

EN

回答 1

Stack Overflow用户

发布于 2019-10-05 23:23:47

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

代码语言:javascript
复制
(in-package :clsql-sys)

(defun %tables-for-query (classes from where inner-joins)
  (declare (ignore where inner-joins))
  (union (mapcar #'select-table-sql-expr classes)
         (listify from)))

但是我还没有运行测试用例clsql-tests

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58246522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档