从中查询的SQL选择结果

从中查询的SQL选择结果,sql,Sql,我正在尝试从from子句中的另一个查询中选择记录 Ex: SELECT * FROM (SELECT * FROM A WHERE A.COL_3=3) B WHERE B.COL_2!=1 FROM子句中的查询返回6条记录,其中A.COL_2的值为1。但当在条件COL_2不等于1的情况下完成对B的选择时,我得到的记录与我在FROM子句中查询时得到的记录相同,COL_2的值为null 这是在informix数据库上 实际查询- SELECT * FROM ( SELECT CASE NV

我正在尝试从from子句中的另一个查询中选择记录

Ex: SELECT * FROM (SELECT * FROM A WHERE A.COL_3=3) B WHERE B.COL_2!=1 
FROM子句中的查询返回6条记录,其中A.COL_2的值为1。但当在条件COL_2不等于1的情况下完成对B的选择时,我得到的记录与我在FROM子句中查询时得到的记录相同,COL_2的值为null

这是在informix数据库上

实际查询-

SELECT * FROM 
(
 SELECT CASE NVL(A.CST_CD,-1)
          WHEN -1 THEN (SELECT 1
                          FROM SOEVNT B
                         WHERE B.KNBR 
                                = CAST(CONCAT(CAST(A.RNBR AS INTEGER),
                                         CASE
                                      WHEN A.RC_NBR >0 AND A.RC_NBR <10
                                      THEN CONCAT('0000',A.RC_NBR)
                                      WHEN A.RC_NBR >9 AND A.RC_NBR <100
                                      THEN CONCAT('000',A.RC_NBR)
                                      WHEN A.RC_NBR >99 AND A.RC_NBR <1000
                                      THEN CONCAT('00',A.RC_NBR)
                                     WHEN A.RC_NBR >999 AND A.RC_NBR <10000
                                      THEN CONCAT('0',A.RC_NBR)
                                      ELSE CAST(A.RC_NBR AS CHAR(5)) 
                                      END) AS INTEGER) 
                             AND B.MTE_EVNT = 'RG'
                             AND B.SO_LINE_NBR = D.DTL_SEQ_NBR)
         ELSE 0
        END AS SOEVNT_1,
        CASE NVL(A.CST_CD,-1)
             WHEN -1 THEN (SELECT 1
                             FROM SOEVNT B
                            WHERE B.KNBR = CAST(CONCAT(CAST(A.RNBR AS INTEGER),
                                           CASE
                                          WHEN A.RC_NBR >0 AND A.RC_NBR <10
                                          THEN CONCAT('0000',A.RC_NBR)
                                          WHEN A.RC_NBR >9 AND A.RC_NBR <100
                                          THEN CONCAT('000',A.RC_NBR)
                                          WHEN A.RC_NBR >99 AND A.RC_NBR <1000
                                          THEN CONCAT('00',A.RC_NBR)
                                          WHEN A.RC_NBR >999 AND A.RC_NBR <10000
                                          THEN CONCAT('0',A.RC_NBR)
                                          ELSE CAST(A.RC_NBR AS CHAR(5)) END) 
                                           AS   INTEGER)
                              AND B.MTE_EVNT = 'K')
                               ELSE 0
         END AS SOEVNT_2, 
      A.RNBR, 
      A.APTYP,
      A.ORNBR, 
      A.RC_NBR,
      NVL(A.CST_CD,-1) AS CSTYP,
      CASE A.CST_CD WHEN 0 THEN 'YR2' 
         WHEN 1 THEN 'OSE' ELSE 'LEG' END AS ORDTYP,
      D.DSNBR,
      A.CTTS,
      (SELECT PO_STAT_CD FROM STR_PO C 
         WHERE C.PO_CTRL_NBR = A.ORD_NBR AND C.APTYP = A.APTYP) AS POSTAT, 
      D.RQTY, A.DRETS
FROM SR A, OUTER (SRS D)
WHERE A.APTYP = 5
 AND A.RTYP != 10
 AND ( DATE(A.DRETS) > TODAY-20) 
         AND A.RC_NBR = D.RC_NBR AND D.RQTY > 0
) WHERE SOEVNT_1 != 1
执行完整查询时的结果集

soevnt_1 soevnt_2 rnbr aptyp ornbr  rc_nbr cstyp ordtyp dsnbr ctts postat rqty drets
NULL      NULL    0077  5    51003  79978   -1   LEG    NULL  NULL  3     NULL 2013-10-14 06:01:54.634
NULL      NULL    0077  5    51011  79966   -1   LEG    NULL  NULL  3     NULL 2013-10-03 05:21:06.493
NULL      NULL    0077  5    51012  79967   -1   LEG    NULL  NULL  3     NULL 2013-10-03 06:02:43.133
NULL      NULL    0077  5    51012  79981   -1   LEG    NULL  NULL  3     NULL 2013-10-17 14:39:25.295
NULL     NULL     0077  5    51013  79968   -1   LEG    NULL  NULL  3     NULL 2013-10-03 14:51:50.132
NULL     NULL     0077  5    51015  79969   -1   LEG    NULL  NULL  3     NULL 2013-10-04 03:59:09.835

这让我想起Informix7.3中的一个老错误,它在子查询中忽略字段

在您的特定查询中,我会尝试以下方法:

  • 指定字段名以选择1。。。也许informix对此很挑剔
  • 创建一个视图(不管您的问题如何,这实际上是一个好主意,因为您将子查询抽象出来,其他人也可以使用它)
  • 如果可以使用存储过程,请选择。。。加入临时工也是个好主意

@AVVD我试图给你的帖子一个好的格式,但我放弃了。我的印象是,不管你想达到什么目的,你的提问都是完全不恰当的。也许,你应该寻找另一种方法…大写字母是怎么回事?大写字母没有什么特别的。我把它格式化成更可读的。这个查询有什么问题?我试着去理解。我试着在选择[outside]中给出所有的列名。它不起作用。我只是一个数据库用户,可以查询数据库。我既不能创建视图也不能运行存储过程。它开始工作了。我去掉了里面的外部连接。我不知道这有什么不同。
soevnt_1 soevnt_2 rnbr aptyp ornbr  rc_nbr cstyp ordtyp dsnbr ctts postat rqty drets
NULL      NULL    0077  5    51003  79978   -1   LEG    NULL  NULL  3     NULL 2013-10-14 06:01:54.634
NULL      NULL    0077  5    51011  79966   -1   LEG    NULL  NULL  3     NULL 2013-10-03 05:21:06.493
NULL      NULL    0077  5    51012  79967   -1   LEG    NULL  NULL  3     NULL 2013-10-03 06:02:43.133
NULL      NULL    0077  5    51012  79981   -1   LEG    NULL  NULL  3     NULL 2013-10-17 14:39:25.295
NULL     NULL     0077  5    51013  79968   -1   LEG    NULL  NULL  3     NULL 2013-10-03 14:51:50.132
NULL     NULL     0077  5    51015  79969   -1   LEG    NULL  NULL  3     NULL 2013-10-04 03:59:09.835