Sql 什么';接下来的代码有什么区别?

Sql 什么';接下来的代码有什么区别?,sql,monetdb,Sql,Monetdb,第一个代码不能在MonetDB中执行: SELECT rc0.id as runcat, x0.id as xrtcat FROM extractedcatalog x0 INNER JOIN image i0 ON i0.id = 1 AND i0.id = x0.image INNER JOIN runningcatalog rc0 ON rc0.zone BETWEEN x0.zone-1

第一个代码不能在MonetDB中执行:

   SELECT rc0.id as runcat, x0.id as xrtcat
    FROM extractedcatalog x0 
    INNER JOIN image i0
          ON i0.id = 1 AND i0.id = x0.image
    INNER JOIN runningcatalog rc0
                 ON rc0.zone BETWEEN x0.zone-1
                                  AND x0.zone+1
                 AND rc0.wm_decl BETWEEN x0.decl - i0.rb_smaj
                                     AND x0.decl + i0.rb_smaj
                 AND rc0.x*x0.x +rc0.y*x0.y +rc0.z*x0.z >cos(radians(i0.rb_smaj));
连接终止

但是下面的代码可以很快执行,为什么

SELECT rc0.id as runcat, x0.id as xrtcat
FROM extractedcatalog x0 
INNER JOIN image i0
      ON i0.id = 1 AND i0.id = x0.image
INNER JOIN runningcatalog rc0
             ON rc0.zone BETWEEN x0.zone-1
                              AND x0.zone+1
             AND rc0.wm_decl BETWEEN x0.decl - i0.rb_smaj
                                 AND x0.decl + i0.rb_smaj
             AND rc0.x*x0.x +rc0.y*x0.y +rc0.z*x0.z >cos(radians(0.0055));
在表映像中,只有一行:id=1,rb_smaj=0.0055。
非常感谢

如果唯一的区别是cos,则将此数字另存为数据库字段并在其上添加索引。

区别在于,第一个查询对所连接的每一行执行
cos()
(这可能是数百万次执行,具体取决于符合条件的行数),而第二个查询对整个查询只执行一次'cos(),所以速度要快得多

如果希望快速执行第一个查询,请尝试将条件移动到WHERE子句,以便每行
图像只调用一次
cos()

SELECT rc0.id as runcat, x0.id as xrtcat
FROM extractedcatalog x0 
INNER JOIN image i0
      ON i0.id = 1 AND i0.id = x0.image
INNER JOIN runningcatalog rc0
    ON rc0.zone BETWEEN x0.zone-1 AND x0.zone+1
    AND rc0.wm_decl BETWEEN x0.decl - i0.rb_smaj AND x0.decl + i0.rb_smaj
WHERE rc0.x*x0.x +rc0.y*x0.y +rc0.z*x0.z > cos(radians(i0.rb_smaj))

如果这不起作用,请尝试创建一个内部查询,以选择条件中涉及的列加上
cos()
结果,并在上面加上where子句。

谢谢Bohermian,如果图像表很大,但图像表只有一行,请告诉我下一步怎么做,好吗,对于最后一个条件涉及3个表,如何创建内部查询来选择条件中涉及的列?