none
select top 语句 RRS feed

  • 问题

  • SELECT TOP 20 * FROM (SELECT * FROM T_CW_MACHINE) A  WHERE (F_MACHINE_ID = 111 and F_MACHINE_NAME = '222' and F_FACTORY_SN = '333' and F_IP = '444')

    为什么第二个SELECT 语句要跟WHERE 子句分开来写?  WHERE 前面的A是什么意思,去掉了不能运行啊。

    • 已移动 邹俊才 2009年9月30日 10:54 (发件人:Visual C#)
    2009年9月30日 2:03

答案

  • 你好!

    -- 这是一个子查询,第二个 Select 查出结果后供第一个 Select 使用 A 是别名,不能去掉
    -- 但它的写法有问题,等同下面的 SQL
    
    SELECT TOP 20 *
    	FROM T_CW_MACHINE
    	WHERE F_MACHINE_ID = 111
    	   AND F_MACHINE_NAME = '222'
           AND F_FACTORY_SN = '333'
           AND F_IP = '444'




    知识改变命运,奋斗成就人生!
    • 已建议为答案 mazhou 2009年9月30日 9:50
    • 已标记为答案 KeFang Chen 2009年10月5日 2:29
    2009年9月30日 2:15
  • 你好 SELECT * FROM T_CW_MACHINE 这个会返回一个记录集
    SELECT TOP 20 * FROM (SELECT * FROM T_CW_MACHINE) 相当于是从这个记录集中再筛选出20条 满足后边where的那些条件

    那里的A相当于是个别名 有时表名很长或者不好书写 用a来替代 就可以很方便 比如SELECT A.F_MACHINE_ID,m.* FROM T_CW_MACHINE A ,myTable m

    在这条语句中,A代表那个Select 返回的记录集SELECT TOP 20 A.F_MACHINE_ID,A.F_MACHINE_NAME  FROM (SELECT * FROM T_CW_MACHINE) A  WHERE (F_MACHINE_ID = 111 and F_MACHINE_NAME = '222' and F_FACTORY_SN = '333' and F_IP = '444') 
    这条语句里的A是可以去掉的

    同时这个语句在这里显得有些累赘 没必要先从T_CW_MACHINE筛选出所有 因为这里边并没有条件
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年9月30日 2:19
  • 子查询效率较低,如果逻辑简单可以多用关联,就是使用join之类。
    另外,总结了一个关于子查询还有表变量等的使用场景,比较粗略聊以参考:
    if 临时数据集的数据量较小
    if 临时数据集只有一两个并且逻辑简单
    if 对性能要求不甚高
    使用子查询
    else 使用关联
    else 使用CTE方式或者表变量
    else 使用临时表

    活着,在IT。
    2009年9月30日 7:41

全部回复

  • 你好!

    -- 这是一个子查询,第二个 Select 查出结果后供第一个 Select 使用 A 是别名,不能去掉
    -- 但它的写法有问题,等同下面的 SQL
    
    SELECT TOP 20 *
    	FROM T_CW_MACHINE
    	WHERE F_MACHINE_ID = 111
    	   AND F_MACHINE_NAME = '222'
           AND F_FACTORY_SN = '333'
           AND F_IP = '444'




    知识改变命运,奋斗成就人生!
    • 已建议为答案 mazhou 2009年9月30日 9:50
    • 已标记为答案 KeFang Chen 2009年10月5日 2:29
    2009年9月30日 2:15
  • 你好 SELECT * FROM T_CW_MACHINE 这个会返回一个记录集
    SELECT TOP 20 * FROM (SELECT * FROM T_CW_MACHINE) 相当于是从这个记录集中再筛选出20条 满足后边where的那些条件

    那里的A相当于是个别名 有时表名很长或者不好书写 用a来替代 就可以很方便 比如SELECT A.F_MACHINE_ID,m.* FROM T_CW_MACHINE A ,myTable m

    在这条语句中,A代表那个Select 返回的记录集SELECT TOP 20 A.F_MACHINE_ID,A.F_MACHINE_NAME  FROM (SELECT * FROM T_CW_MACHINE) A  WHERE (F_MACHINE_ID = 111 and F_MACHINE_NAME = '222' and F_FACTORY_SN = '333' and F_IP = '444') 
    这条语句里的A是可以去掉的

    同时这个语句在这里显得有些累赘 没必要先从T_CW_MACHINE筛选出所有 因为这里边并没有条件
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年9月30日 2:19
  • 子查询效率较低,如果逻辑简单可以多用关联,就是使用join之类。
    另外,总结了一个关于子查询还有表变量等的使用场景,比较粗略聊以参考:
    if 临时数据集的数据量较小
    if 临时数据集只有一两个并且逻辑简单
    if 对性能要求不甚高
    使用子查询
    else 使用关联
    else 使用CTE方式或者表变量
    else 使用临时表

    活着,在IT。
    2009年9月30日 7:41