Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 选择存在与限制1_Python_Sql_Postgresql - Fatal编程技术网

Python 选择存在与限制1

Python 选择存在与限制1,python,sql,postgresql,Python,Sql,Postgresql,我看到SELECT EXISTS的用法非常类似: if db.query(""" SELECT EXISTS ( SELECT 1 FROM checkout WHERE checkout_id = %s ) """ % checkout_id).getresult()[0][0] == 't': 与我喜欢的相比: if db.query(""" SELECT 1 FROM

我看到
SELECT EXISTS
的用法非常类似:

    if db.query("""
        SELECT EXISTS (
            SELECT 1 FROM checkout
            WHERE checkout_id = %s
        )
    """ % checkout_id).getresult()[0][0] == 't':
与我喜欢的相比:

    if db.query("""
        SELECT 1 FROM checkout
        WHERE checkout_id = %s
        LIMIT 1
    """ % checkout_id).getresult():
哪一个是首选的,为什么

另外,我正在使用Python和PosgreSQL

cert=> explain SELECT EXISTS (SELECT 1 FROM checkout WHERE checkout_id = 3);
                                      QUERY PLAN                                      
--------------------------------------------------------------------------------------
 Result  (cost=4.03..4.03 rows=1 width=0)
   InitPlan
     ->  Index Scan using checkout_pkey on checkout  (cost=0.00..4.03 rows=1 width=0)
           Index Cond: (checkout_id = 3)
(4 rows)

cert=> explain SELECT 1 FROM checkout WHERE checkout_id = 3 limit 1;
                                     QUERY PLAN                                     
------------------------------------------------------------------------------------
 Limit  (cost=0.00..4.03 rows=1 width=0)
   ->  Index Scan using checkout_pkey on checkout  (cost=0.00..4.03 rows=1 width=0)
         Index Cond: (checkout_id = 3)
(3 rows)

我的观点是,为什么要从结果中获取一行并检查它的第一列是否为真,如果我可以只检查是否有行,意思是相同的?

当使用
EXPLAIN
时,您可以看到第一条语句将执行额外的子查询,而第二条语句则不会

这就是为什么我更喜欢使用
limit
而不是
exists

例如:

explain SELECT EXISTS (SELECT 1 FROM checkout WHERE id = 3);
explain SELECT 1 FROM checkout WHERE id = 3 limit 1;

在我看来,第二条语句是有问题的,因为如果条件不满足,它将不会返回一行。

PostgreSQL似乎足够聪明,可以像您在执行计划中清楚看到的那样,将这两条语句一视同仁

我对一个本地表的测试也显示了相同的行为,该本地表有约150000行,并且根据条件从中选择了约100行


底线是:使用哪种数据库并不重要,但您应该知道其他数据库管理系统可能不会以同样的方式运行。

绝对不是SQL Server。限制1告诉我这可能是mysql(只是猜测)PostgreSQL为两个版本生成(几乎)相同的执行计划。所以他们之间应该没有区别。。。我认为他使用的是php+mysql。
exists
操作符可以在返回的第一行停止,因此即使对于mysql的优化器,这两个语句之间也应该没有区别。对不起,我认为这不相关:我使用的是Python和PosgreSQLThat's obhious,您总是将sunquery指定为
exists
,以检查行的存在性。Documenation本身说,
指定一个子查询来测试行的存在性
,这确实是一个正确的语句。我不知道这嵌入了什么过程语言(php?),所以可能db.query.Yes引发了一个异常,这就是想法——您只需检查是否有返回的行。如果没有返回行,则筛选器没有记录。