有没有办法不将sql请求的结果保存为数组,而是保存为表对象,以便在其他sql请求中重用?
例如,让我保存请求的结果 (books tagged with 'c++')
```
SELECT BOOK
FROM BOOK_TAGS
WHERE TAG = 'C++';
然后,对于选择带有标记“c++”和“gamedev”的书籍,我不想再次滚动所有的book\u标记表,我想从以前保存的结果中选择它们
像这样的
SELECT BOOK
FROM $TAGGED JOIN BOOK_TAGS USING(BOOK)
WHERE TAG = 'gamedev';
4条答案
按热度按时间dddzy1tm1#
我不知道你的意思,但所有来自sql的请求都是表对象
只给你两个标签的书
wko9yo5t2#
可以使用表变量,但为什么不合并到一个查询中呢?您的查询优化器应该执行以下工作,以确保它不会低效:
你好像也漏掉了什么。你的意思是从
BOOKS
具有多对多关系的表TAGS
table(带BOOK_TAGS
作为联接表)?lzfw57am3#
您可以通过创建一个表来临时保存几乎所有的结果。
最简单的方法是:
这种方法的好处是,临时表仅在当前数据库连接上可见,并在连接关闭时自动清除。但是,它们不能像普通表那样自由地使用(没有自联接,不能在联合中引用两次,等等…)
您可以使用非临时表,但它们在连接之间是可见的,因此您可能会有多个客户端同时操作它们的风险,而且它们是持久的,因此您必须确保自己清理它们(并且在连接丢失后也会正确清理它们)。
这两种方法的缺点都是没有自动索引,因此通常在创建此类“缓存”表时必须更加正式,然后使用
INSERT .... SELECT
. 通常,在这一点上,它变得比它的价值更麻烦,除非您要经历所有这些来修复现有单个查询中的性能问题。对于像您介绍的那样简单的查询,像这样保存结果通常没有真正的好处。
ercv8c1e4#
我在评论中陷入了xy问题,但当我看到其他一些答案时,我重新考虑了这个问题:
如果你的目标是归还所有带有两个标签的书。。。
注意:我使用distinct,以防一个标签可以复制一本书;如果表设计防止了这种重复,那么不应该使用distinct。
或:
基于第一个查询创建一个视图
创建一个包含结果的表(这样结果就不会像在视图中那样改变)
.
后来呢
但我不喜欢这样在飞行中改变结构。