【问题标题】:How to LEFT JOIN in INFORMIX SQL如何在 INFORMIX SQL 中左连接
【发布时间】:2018-02-21 21:56:32
【问题描述】:

我对 Informix db 有以下有效的 sql 查询。

SELECT soi_seq,soi_cusitem,max(soi_product) as ProductCode, 
       max(soi_custprod) as CustProductCode, max(soi_desc) AS ProductDesc, 
       max(soi_comdt2) AS RequiredDate, sum(soi_itqty) as Qty, 
       sum(soi_invval) as Nett, max(soi_discper) as Discount, max(soi_per) 
       as Per, max(soi_price) as ItemPrice 
       from soitem 
       where soi_ordref= ? group by soi_seq,soi_cusitem, soi_lineref 
       order by soi_cusitem asc

我需要加入另外两个表,但不知道如何使用 informix 语法, 基本上我需要在以下连接上方的查询中添加:

       Left Join cmprod on soi_product = cmp_product
       Left Join cmass on cmp_product = cmass_product 

另外,在 WHERE 子句中添加以下内容:

      AND cmass_assem Is Null

我可以使用旧的 MS Access 连接到 Informix 数据库而不是在代码中查询并获得所需的结果。

【问题讨论】:

  • ANSI SQL:select ... from t1 left join t2 on t1.c = t2.d left join t3 on t2.e = t3.f where ... group by ... order by ....
  • 已经试过了,得到 System.Data.Odbc.OdbcException: 'ERROR [42000] [Informix][Informix ODBC Driver][Informix]出现语法错误。'
  • 我解决了我的问题,将原始查询保留到数据表,创建了对数据表的单独查询,然后通过 linq 对数据表进行了所需的连接。看来我们的旧版本 informix 不支持连接。
  • 您使用的是哪个版本的 Informix?如果它不支持 LEFT JOIN 表示法,那么它一定早就不支持了。

标签: sql informix


【解决方案1】:

Informix 的早期版本使用 outer 关键字,如下所示:

SELECT soi_seq, soi_cusitem, soi_lineref,
       MAX(soi_product) AS ProductCode, 
       MAX(soi_custprod) AS CustProductCode,
       MAX(soi_desc) AS ProductDesc, 
       MAX(soi_comdt2) AS RequiredDate,
       SUM(soi_itqty) AS Qty, 
       SUM(soi_invval) AS Nett,
       MAX(soi_discper) AS Discount,
       MAX(soi_per) AS Per,
       MAX(soi_price) AS ItemPrice 
FROM soitem, -- look, it uses comma to separate tables, even if outer is used
   outer (cmprod CMP, 
   outer cmass CMA)
   -- it requires to order tables with parenthesis
   -- I assume soitem->cmprod->cmass
WHERE 
   -- for good understanding, resolve joins first
   soi_product = CMP.cmp_products 
   AND CMP.cmp_product = CMA.cmass_product 
   -- then match your selection
AND oi_ordref = ? 

很抱歉答案迟到了一年,我会把它留在这里供以后的搜索者使用

Informix outer joins

【讨论】:

    【解决方案2】:

    这应该可行

    SELECT soi_seq, soi_cusitem, soi_lineref,
           MAX(soi_product) AS ProductCode, 
           MAX(soi_custprod) AS CustProductCode,
           MAX(soi_desc) AS ProductDesc, 
           MAX(soi_comdt2) AS RequiredDate,
           SUM(soi_itqty) AS Qty, 
           SUM(soi_invval) AS Nett,
           MAX(soi_discper) AS Discount,
           MAX(soi_per) AS Per,
           MAX(soi_price) AS ItemPrice 
    FROM soitem
    LEFT JOIN cmprod ON soi_product = cmp_product
    LEFT JOIN cmass ON cmp_product = cmass_product 
    WHERE soi_ordref = ?
          AND cmass_assem IS NULL
    GROUP BY 1,2,3 
    ORDER BY 2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      • 1970-01-01
      • 2017-03-10
      • 2016-10-02
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多