代码之家  ›  专栏  ›  技术社区  ›  slevin

在PostgreSQL中结合CTE和IN

  •  1
  • slevin  · 技术社区  · 6 年前

    所以我在postgresql10中有一个简单的查询。

    with bunch_of_things as (
        select vans_id from shoes where adidas_id = 1
    )
    
    select * from vans where vans.id in (bunch_of_things) ;
    

    我犯了个错误 column "bunch_of_things" does not exist

    那么我怎样才能让它和CTE一起工作呢?

    (如果这是不可能的,我怎样才能获得一次查询结果并在事务中多次使用它们?)

    谢谢

    2 回复  |  直到 6 年前
        1
  •  1
  •   Roman-Stop RU aggression in UA    6 年前

    with bunch_of_things as (
        select vans_id from shoes where adidas_id = 1
    )
    
    select * from vans where vans.id in (select vans_id from bunch_of_things);
    

    但是有几件事你需要考虑。

    首先, EXISTS 通常性能优于 IN

    with bunch_of_things as (
        select vans_id from shoes where adidas_id = 1
    ) 
    select * 
      from vans v
    where EXISTS (
        select 1
        from bunch_of_things b
        where b.vans_id = v.id
    )
    

    might 但要改变)。在某些情况下,这可能是控制查询执行的一种有用的方法,这绝对是您应该考虑的问题。

    执行查询并在事务中重用结果的另一种方法是使用以下临时表:

    CREATE TEMPORARY TABLE bunch_of_things (vans_id integer)
    ON COMMIT DROP;
    
    INSERT INTO bunch_of_things (vans_id)
    SELECT vans_id FROM shoes where adidas_id = 1;
    

    然后像往常一样使用桌子:

    select * 
      from vans v
    where EXISTS (
        select 1
        from bunch_of_things b
        where b.vans_id = v.id
    )
    
        2
  •  1
  •   Evan Carroll    6 年前

    你会想要这样的东西,

    SELECT *
    FROM vans
    WHERE EXISTS (
        SELECT
        FROM shoes
        WHERE adidas_id = 1
          AND vans_id = vans.id
    )
    

    那会快得多。

    推荐文章