SELECT  DISTINCT nom
 FROM (SELECT DISTINCT nom, prix_base FROM "JouetSchema"."Jouet") AS j
 WHERE prix_base BETWEEN 15 AND 45
 ORDER BY nom ASC;
好几次看到查询from句后面又跟一个(select from) ,我不清楚什么时候要用这样的写法,还有就是rename的as,什么时候必须使用??谢谢

解决方案 »

  1.   

    1.子查询时。尽管有时候写一个select也可以,但是这样分层写会让思路更清晰;有时候却是必须写,例如:
    select * from
    (
    select a, rownum from table1
    )
    where rownum < 100;
    不能写:
    select a, rownum from table1 
    where rownum < 100;
    2.as 别名,去掉也可以。
      

  2.   

    看错了上面说的rownum是oracle的语法
    MSSQL下的例子:
    select * from
    (
    select a, ROW_NUMBER() over (order by id desc) rownum from table1
    )
    where rownum < 100;
    不能写:
    select a, ROW_NUMBER() over (order by id desc) rownum from table1
    where rownum < 100;
      

  3.   

    as是可以省略,但是建议加上,增强可读性。from后面应该加一个“结果集”,而那个select出来的就是一个结果集。
      

  4.   


    在from后面又加上一个查询,就是一个子查询,一般称为:派生表,你可以把它当成是一个中间结果集,也就是外层的select子句,会从内层中,别名为j的,中间结果集中再进行select,之所以要这么写是因为代码相对容易理解。不过你上面的代码,其实可以不用这么写,可以简单写成这样,这个和你上面写的是一样的:
    SELECT DISTINCT nom
    FROM "JouetSchema"."Jouet"
    WHERE prix_base BETWEEN 15 AND 45
    ORDER BY nom ASC;
      

  5.   


    那使用派生表的方法和使用with...as(select..from..)有什么区别呢?还是两者是等价的
      

  6.   

    从最终结果来说,目的都是使用一个临时结果集,然后处理这个结果集,但是with,也就是CTE,是在2005才开始有的,同时根据我的性能测试,CTE对大数据量处理性能不高。并且CTE生成的结果你是不能在后续更改的,即不能update/delete/insert一个CTE的结果集。另外,CTE有一个很明显的限制,只能在紧跟着它后面的第一个语句有效。
      

  7.   

    from后跟一个‘数据集’,最简单的select * from table where...   其实一张‘表’就是一个‘数据集’,只是‘表’是数据库里原始的‘数据集’。同理一个select子句也是一个‘数据集’,也可以跟在from后面,只不过是一个经过条件筛选或者处理的‘数据集’,不是数据库里的原始数据集。
    as是重新声明一个字段的名字,像sum() count()这类统计结果是没有字段名,引用结果时不方便,于是就给一个自定义的名字。同样as也可以用作改名,如果不想使用在数据库里的字段名,可以改成自己喜欢的。注意:as的作用只限于查询的结果,不会修改数据库里的原字段名。
      

  8.   


    使用派生表的方法和使用with...as(select..from..)是一样的,SQL Server在2005之所以提出with这种写法,是因为通过with能是SQL 代码的结构更好,更加容易看懂,比如:本来在代码中会多次用到同一个派生表,那么得写多次,现在有了with,那么只要写一次就可以了,下面就可以多次引用,非常方便。另外,性能上和一般的派生表没什么区别,一般引用多次会计算多次,对于数据量比较大的,可以通过把查询出来的数据写入临时表来提高性能。性能方面和一般的派生表没什么差别。