Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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
Sql 代码>不存在到存在可以产生任意数量的行_Sql_Postgresql_Where_Postgresql 9.2_Exists - Fatal编程技术网

Sql 代码>不存在到存在可以产生任意数量的行

Sql 代码>不存在到存在可以产生任意数量的行,sql,postgresql,where,postgresql-9.2,exists,Sql,Postgresql,Where,Postgresql 9.2,Exists,考虑到你是建立在错误的假设之上,我建议你重新评估你的发现,如果可以的话,再来一次 condition_3d和condition_3e将select_2与select_3链接,但这是一个非常松散的耦合,因为优先级_id和名称可能分别链接到不同的博客和标签。在没有看到实际数据的情况下,我建议可能需要通过指定select_2.blog_id=select_3.blog_id(或类似)在select_2和select_3之间建立更紧密的链接 关于您的伪代码,我对代码的内容进行以下解释: 如果有来自org

考虑到你是建立在错误的假设之上,我建议你重新评估你的发现,如果可以的话,再来一次

condition_3d和condition_3e将select_2与select_3链接,但这是一个非常松散的耦合,因为优先级_id和名称可能分别链接到不同的博客和标签。在没有看到实际数据的情况下,我建议可能需要通过指定select_2.blog_id=select_3.blog_id(或类似)在select_2和select_3之间建立更紧密的链接

关于您的伪代码,我对代码的内容进行以下解释:

  • 如果有来自org=22的标记,并且没有来自org=4的blog_标记,其中活动的“foo”blog具有相同的优先级,并且标记具有相同的名称
  • 如果存在来自org=22的标记,并且存在来自org=4的blog_标记,其中活动的“foo”blog具有相同的优先级,并且标记具有相同的名称
  • 在案例1中。Select_2将返回一组行,其中标记、blogs和blog_标记的组合排除了匹配条件。例如,标签a、b、d和f

    在案例2中。Select_2将返回一组行,其中标记、blogs和blog_标记的组合包括匹配条件。例如,可能是标记c,e,g,k

    无论哪种方式,Select_2都找到了一些东西,这就是返回所有结果所需的全部内容

    注意:查询之间的别名非常特殊,很难看到每个查询中使用的特定表的位置。blog_标记在select_1或select_3中都没有别名,blog的别名为t。我建议在查询中的所有实例中始终使用相同的首字母缩略词(即blog_标记始终为bt),然后为每个实例(即bt1、bt2等)附加一个数字。详情如下:

    SELECT count(*) FROM blog_tags AS bt  -- add alias
    WHERE bt.subscribed = true
    AND bt.special = true
    AND EXISTS (
        SELECT 1
        FROM tags AS t1   -- add alias
        INNER JOIN blog_tags AS bt1 ON bt1.tag_id = t1.id -- change alias
        INNER JOIN blogs AS b1 ON bt1.blog_id = b1.id  -- change alias
        WHERE b1.org_id = 22
        AND NOT EXISTS ( /* Removing the "NOT" on this line has no effect */
            SELECT 1
            FROM blog_tags AS bt2 -- change alias
            INNER JOIN tags AS t2 ON bt2.tag_id = t2.id -- change alias
            INNER JOIN blogs AS b2 ON bt2.blog_id = b2.id -- change alias
            WHERE b2.org_id = 4
            AND b2.active = true
            AND b2.type = 'foo'
            AND b2.priority_id = b1.priority_id
            AND t2.name = t1.name
        )
    );
    
    condition_3d和condition_3e将select_2与select_3链接,但这是一个非常松散的耦合,因为优先级_id和名称可能分别链接到不同的博客和标签。在没有看到实际数据的情况下,我建议可能需要通过指定select_2.blog_id=select_3.blog_id(或类似)在select_2和select_3之间建立更紧密的链接

    关于您的伪代码,我对代码的内容进行以下解释:

  • 如果有来自org=22的标记,并且没有来自org=4的blog_标记,其中活动的“foo”blog具有相同的优先级,并且标记具有相同的名称
  • 如果存在来自org=22的标记,并且存在来自org=4的blog_标记,其中活动的“foo”blog具有相同的优先级,并且标记具有相同的名称
  • 在案例1中。Select_2将返回一组行,其中标记、blogs和blog_标记的组合排除了匹配条件。例如,标签a、b、d和f

    在案例2中。Select_2将返回一组行,其中标记、blogs和blog_标记的组合包括匹配条件。例如,可能是标记c,e,g,k

    无论哪种方式,Select_2都找到了一些东西,这就是返回所有结果所需的全部内容

    注意:查询之间的别名非常特殊,很难看到每个查询中使用的特定表的位置。blog_标记在select_1或select_3中都没有别名,blog的别名为t。我建议在查询中的所有实例中始终使用相同的首字母缩略词(即blog_标记始终为bt),然后为每个实例(即bt1、bt2等)附加一个数字。详情如下:

    SELECT count(*) FROM blog_tags AS bt  -- add alias
    WHERE bt.subscribed = true
    AND bt.special = true
    AND EXISTS (
        SELECT 1
        FROM tags AS t1   -- add alias
        INNER JOIN blog_tags AS bt1 ON bt1.tag_id = t1.id -- change alias
        INNER JOIN blogs AS b1 ON bt1.blog_id = b1.id  -- change alias
        WHERE b1.org_id = 22
        AND NOT EXISTS ( /* Removing the "NOT" on this line has no effect */
            SELECT 1
            FROM blog_tags AS bt2 -- change alias
            INNER JOIN tags AS t2 ON bt2.tag_id = t2.id -- change alias
            INNER JOIN blogs AS b2 ON bt2.blog_id = b2.id -- change alias
            WHERE b2.org_id = 4
            AND b2.active = true
            AND b2.type = 'foo'
            AND b2.priority_id = b1.priority_id
            AND t2.name = t1.name
        )
    );
    

    这是巧合吗?无论哪种方式,都可能有相同数量的符合条件的行。少量的样本数据来重现问题将是有趣和有用的。您确定连接条件或WHERE子句的其他部分不是问题的根源吗?我的猜测是,
    org\u id
    从来都不是22。您是否尝试单独运行外部子查询,同时使用exists和not exists?你每次都得到相同数量的行吗?@GordonLinoff:如果
    org\u id
    从来都不是22,那么计数是0,而不是237。这是巧合吗?无论哪种方式,都可能有相同数量的符合条件的行。少量的样本数据来重现问题将是有趣和有用的。您确定连接条件或WHERE子句的其他部分不是问题的根源吗?我的猜测是,
    org\u id
    从来都不是22。您是否尝试单独运行外部子查询,同时使用exists和not exists?你每次都得到相同数量的行吗?@GordonLinoff:If
    org\u id
    从不为22,则计数为0,而不是237。 count(*) can only return a non-zero number of rows
    ...
        AND NOT EXISTS ( /* Removing the "NOT" on this line has no effect */
            /* condition_2b (the entire NOT EXISTS inside these parentheses */
            /* select_3 */
            SELECT 1
            FROM sometable1
            INNER JOIN join_expression_2a
            INNER JOIN join_expression_2b
            WHERE condition_3a
            AND condition_3b
            AND condition_3c
            AND condition_3d    --- this condition links select_2 to select_3
            AND condition_3e    --- this condition links select_2 to select_3
        )
    );
    
    SELECT count(*) FROM blog_tags AS bt  -- add alias
    WHERE bt.subscribed = true
    AND bt.special = true
    AND EXISTS (
        SELECT 1
        FROM tags AS t1   -- add alias
        INNER JOIN blog_tags AS bt1 ON bt1.tag_id = t1.id -- change alias
        INNER JOIN blogs AS b1 ON bt1.blog_id = b1.id  -- change alias
        WHERE b1.org_id = 22
        AND NOT EXISTS ( /* Removing the "NOT" on this line has no effect */
            SELECT 1
            FROM blog_tags AS bt2 -- change alias
            INNER JOIN tags AS t2 ON bt2.tag_id = t2.id -- change alias
            INNER JOIN blogs AS b2 ON bt2.blog_id = b2.id -- change alias
            WHERE b2.org_id = 4
            AND b2.active = true
            AND b2.type = 'foo'
            AND b2.priority_id = b1.priority_id
            AND t2.name = t1.name
        )
    );