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

时间:2010-10-14 04:11:15

标签: sql mysql

这就是我想做的事情,但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是主键,LftRht列上有唯一索引。

这样的事情怎么可能完成?

*注意:我当前正在使用MySQL,但我希望尽可能避免任何MySQL扩展,因为有可能计划在将来某个时候迁移到Postgres或Oracle等其他数据库...

2 个答案:

答案 0 :(得分:4)

它没有被接受,因为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)

答案 1 :(得分:2)

显然这只是一个简单的语法错误(WHERE太多),但是如果你想避免使用标量子选择,你也可以进行连接(具有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 ;