SELECT QAB001 AS 主件 ,QAB003 as 子件 ,LOA002 AS 仓库,LOA003 AS 数量
FROM JSKLOA,SGMQAB,TPADEA
WHERE LOA001=QAB001 AND LOA001='0932-8503-738262' 
and  DEA001=QAB003
and  DEA001 IN (SELECT * FROM JSKLOA,SGMQAB WHERE LOA001=QAB001 AND LOA001='0932-8503-738262')
进行时提示
服务器: 消息 116,级别 16,状态 1,行 1
当没有用 EXISTS 引入子查询时,在选择列表中只能指定一个表达式。

解决方案 »

  1.   

     DEA001 IN (SELECT DEA001 FROM JSKLOA
      

  2.   

    SELECT QAB001 AS 主件 ,QAB003 as 子件 ,LOA002 AS 仓库,LOA003 AS 数量
    FROM JSKLOA,SGMQAB,TPADEA
    WHERE LOA001=QAB001 AND LOA001='0932-8503-738262'  
    and DEA001=QAB003
    and DEA001 IN (SELECT DEA001 FROM JSKLOA,SGMQAB WHERE LOA001=QAB001 AND LOA001='0932-8503-738262')
      

  3.   

    SQL中IN和EXISTS用法的区别 1.exist,not exist一般都是与子查询一起使用. In可以与子查询一起使用,也可以直接in (a,b.....)
    2.exist会针对子查询的表使用索引. not exist会对主子查询都会使用索引. in与子查询一起使用的时候,只能针对主查询使用索引. not in则不会使用任何索引. 注意,一直以来认为exists比in效率高的说法是不准确的。
    in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。
    如果查询的两个表大小相当,那么用in和exists差别不大。
    如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:
    例如:表A(小表),表B(大表)1:select * from A where cc in (select cc from B)
    效率低,用到了A表上cc列的索引;select * from A where exists(select cc from B where cc=A.cc)
    效率高,用到了B表上cc列的索引。
    相反的2:select * from B where cc in (select cc from A)
    效率高,用到了B表上cc列的索引;select * from B where exists(select cc from A where cc=B.cc)
    效率低,用到了A表上cc列的索引。
    not in 和not exists如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。3.exist与in都可以实现一个目的.二者都可以用来过滤数据.
    示例:select count(1) from t1;--160Wselect count(1) from t2; --90WSELECT count(1)FROM t1 aWHERE EXISTS (SELECT accountidFROM t2 bWHERE a.keyid = b.keyid AND a.ideaid = b.ideaid);--主大子小,不适合使用exist,因为exist只会利用子表t2的复合索引keyid+ideaid,而子表内容要小与主表,主表由于无法使用索引,查询效率低下.select count(1) from t1 a where accountid in (SELECT accountidFROM t2 bWHERE a.keyid = b.keyid AND a.ideaid = b.ideaid);--主大子小,适合用in,因为in只会使用主表t1里面的复合主键keyid-ideaid,在主表大于子表的情况下,会很好的利用主表的索引.          --后二条sql的执行结果都是一样的.说明exist与in在用法上可以达到一个目的,不同的地方是--1.性能的考虑此时就按子表大主表小用exist,子表小主表大用in的原则就可以.--2.写法的不同, exist的where条件是:      "......  where exist (..... where a.id=b.id)"--in的where条件是: " ...... where  id in ( select id .... where a.id=b.id)"
    in 与 =的区别:
    select name from student where name in ('zhang','wang','li','zhao');

    select name from student where name='zhang' or name='li' or name='wang' or name='zhao'
    的结果是相同的。in的字段也可以与其它字段建复合索引.比如T1包含下面key, accountd,groupid.SELECT   *  FROM   T1  a WHERE       a.groupid = 2001         AND a.accountid = 1001         AND a.key IN ('abc', 'def', 'ala');--上面的sql可以将accountid,key建成复合索引.in 指针对一列中查询出的多种数据结果,而不会对于多列中的多种数据结果,所以你的做法应该改为:
    SELECT QAB001 AS 主件 ,QAB003 as 子件 ,LOA002 AS 仓库,LOA003 AS 数量
    FROM JSKLOA,SGMQAB,TPADEA
    WHERE LOA001=QAB001 AND LOA001='0932-8503-738262'  
    and DEA001=QAB003
    and DEA001 IN (SELECT DEA001 FROM JSKLOA,SGMQAB WHERE LOA001=QAB001 AND LOA001='0932-8503-738262')
      

  4.   

    SELECT QAB001 AS 主件 ,QAB003 as 子件 ,DEA002 AS 品名,DEA057 AS 规格,DEA003,LOA002 AS 仓库,LOA003 AS 数量
    FROM JSKLOA,SGMQAB,TPADEA
    WHERE LOA001=QAB001 AND LOA001='0932-8503-738262' 
    and  DEA001=QAB003
    and DEA001 IN (SELECT DEA001 FROM JSKLOA,SGMQAB WHERE LOA001=QAB001 AND LOA001='0932-8503-738262' )经指点一下这样写没提示错误,但结果不行。
    这是查询ERP系统里面的东西,TPADEA 是品号信息  JSKLOA是库存   SGMQAB 是BOM表
    我想通过输入主件就可以查询出子件的库存。现在结果是仓库一样数量也是一样的。
      

  5.   

    对主件,子件,品名,规格,仓库做GROUP BY后,在数量上合计,最后那个IN看起来也没什么用了:
    SELECT QAB001 AS 主件 ,QAB003 as 子件 ,DEA002 AS 品名,DEA057 AS 规格,DEA003,LOA002 AS 仓库,SUM(LOA003) AS 数量
    FROM JSKLOA,SGMQAB,TPADEA
    WHERE LOA001=QAB001 AND LOA001='0932-8503-738262'  
    and DEA001=QAB003
    Group by QAB001, QAB003 ,DEA002 ,DEA057 ,DEA003,LOA002