代码之家  ›  专栏  ›  技术社区  ›  Billy ONeal IS4

如何在SQL中将单行列转换为标量?

  •  1
  • Billy ONeal IS4  · 技术社区  · 14 年前

    这是我想做的,但MySQL似乎不接受它。

    SELECT Name, Content, Lft, Rht FROM Articles WHERE
        (Lft > (SELECT Lft FROM Articles WHERE idArticle = 1))
        AND WHERE
        (Rht < (SELECT Rht FROM Articles WHERE idArticle = 1));
    

    我正在执行 modified preorder tree transversal 算法,我想得到 Article 使用单个数据库查询。

    项目表如下所示:

    Articles
    +=============+===========+
    | Type        | Name      |
    +=============+===========+
    | VARCHAR(45) | Name      |
    +-------------+-----------+
    | LONGTEXT    | Content   |
    +-------------+-----------+
    | INT         | Lft       |
    +-------------+-----------+
    | INT         | Rht       |
    +-------------+-----------+
    | INT         | idArticle |
    +-------------+-----------+
    

    idArticle 是主键,并且在 Lft Rht 柱。

    这样的事情怎么可能实现呢?

    *注意:我是 目前 使用MySQL,但我想尽可能避免使用任何MySQL扩展,因为将来某个时候可能会有迁移到另一个数据库的计划,如Postgres或Oracle…

    2 回复  |  直到 14 年前
        1
  •  2
  •   OMG Ponies    14 年前

    显然,这只是一个简单的语法错误(其中的语法错误太多),但是如果您想避免使用标量嵌套select,那么您也可以进行一次联接(具有IDarticle 1的行只需要加载一次的潜在优势,这是一种您的查询计划者可能自己解决不了的优化):

    SELECT a.Name, a.Content, a.Lft, a.Rht FROM Articles a
       join Articles b on (b.idArticle =1 )
       where a.lft > b.lft and a.rht < b.rht;
    

    替代当量

    SELECT a.Name, a.Content, a.Lft, a.Rht 
      FROM Articles a
      join Articles b on a.lft > b.lft 
                     and a.rht < b.rht 
                     AND b.idArticle = 1 ;
    
        2
  •  4
  •   OMG Ponies    14 年前

    它不被接受,因为where关键字只能在查询中出现一次(在子查询之外):

    SELECT x.name,  
           x.content, 
           x.lft, 
           x.rht 
      FROM ARTICLES x
     WHERE EXISTS(SELECT NULL
                    FROM ARTICLES y
                   WHERE y.idarticle = 1
                     AND y.lft < x.lft)
      AND EXISTS(SELECT NULL
                   FROM ARTICLES z
                  WHERE z.idarticle = 1
                    AND z.rht > x.rht)