在Informix风格的SQL中如何使用`outer`?

问题描述 投票:1回答:3

我继承了一些<cough> ugly </cough>代码,其中包含一个相当笨拙的SQL语句,该语句命中了Informix数据库。这段代码计算了SQL的各个部分,并进行了许多字符串连接,但是我让它吐出了它实际发送给Informix的内容,并尝试在SQL查询工具中使用它。它在服务器上运行时可以运行,但是当我尝试在FlySpeed SQL(这是在办公室使用的“批准”工具)中运行它时,它抱怨outer作为未知关键字。谷歌搜索使我无处可去,所以我猜想这是LEFT OUTER JOIN的Informix快捷方式,但是用它替换它并不能解决问题,所以我猜想那只是FlySpeed中的错误。

SQL完全未格式化,我想这是使FlySpeed失败的一部分。

SELECT A.CRSPD_SETID, A.CRSPD_CUST_ID, F.ST_ID_NUM as STMT_NBR, F.ST_DT, A.BUSINESS_UNIT, H.ASOF_DT, H.DUE_DT, A.ITEM, H.CONTRACT_NUM, D.DESCR as ENTRY_TYPE_DESCR, G.DESCR as ENTRY_REASON_DESCR, SUM(A.BAL_AMT) as ORIG_BAL_AMT, SUM(H.BAL_AMT), C.NAME1, B.ADDRESS1, B.ADDRESS2, B.ADDRESS3, B.ADDRESS4, B.CITY, B.STATE, B.POSTAL, A.BAL_CURRENCY, A.CUST_ID, A.ENTRY_TYPE as ORIG_ENTRY_TYPE, CASE WHEN A.ENTRY_TYPE = 'PY' OR A.ENTRY_TYPE = 'BGB' THEN 'AA' || substr(A.ENTRY_TYPE,1,3) ELSE  substr(A.ENTRY_TYPE,1,3) END, A.ENTRY_REASON as ORIG_ENTRY_REASON, C.CUSTOMER_TYPE, K.AR_LVL, H.ORDER_NO FROM PS_STMT_CUST_DTL A, PS_CUST_ADDRESS B, PS_CUSTOMER C, PS_SET_CNTRL_REC E, PS_STMT_CUST F, PS_ENTRY_TYPE_TBL D, PS_ENTRY_REASN_TBL G, outer PS_ITEM H, outer PS_BI_TYPE K WHERE A.ADDRESS_SEQ_NUM = B.ADDRESS_SEQ_NUM AND B.EFFDT = (SELECT MAX(B_ED.EFFDT) FROM PS_CUST_ADDRESS B_ED Where B.SETID = B_ED.SETID AND B.CUST_ID = B_ED.CUST_ID AND B.ADDRESS_SEQ_NUM = B_ED.ADDRESS_SEQ_NUM AND B_ED.EFFDT <=  '06/19/2013') AND A.CRSPD_SETID = B.SETID AND A.CRSPD_CUST_ID = B.CUST_ID AND B.SETID = C.SETID AND B.CUST_ID = C.CUST_ID AND B.ADDRESS_SEQ_NUM = C.ADDRESS_SEQ_NUM AND G.ENTRY_TYPE = A.ENTRY_TYPE AND G.ENTRY_REASON = A.ENTRY_REASON AND G.SETID = E.SETID AND G.SETID = D.SETID AND G.ENTRY_TYPE = D.ENTRY_TYPE AND E.SETCNTRLVALUE = A.BUSINESS_UNIT AND E.RECNAME = 'ENTRY_TYPE_TBL' AND A.CRSPD_SETID = F.CRSPD_SETID AND A.CRSPD_CUST_ID = F.CRSPD_CUST_ID AND A.ST_ID_NUM = F.ST_ID_NUM AND A.BUSINESS_UNIT = H.BUSINESS_UNIT AND A.CUST_ID = H.CUST_ID AND A.ITEM = H.ITEM AND A.ITEM_LINE = H.ITEM_LINE AND substr(A.ENTRY_TYPE,1,3) = K.BILL_TYPE_ID AND K.SETID = 'SPN' AND K.EFFDT = (SELECT MAX(C_ED.EFFDT) FROM PS_BI_TYPE C_ED WHERE K.SETID = C_ED.SETID AND K.BILL_TYPE_ID = C_ED.BILL_TYPE_ID AND C_ED.EFFDT <=  '06/19/2013') AND K.EFF_STATUS = 'A' AND A.CRSPD_CUST_ID =  '000331' AND A.CRSPD_SETID = 'SPN' AND F.ST_DT = '' AND F.ST_ID_NUM = '' GROUP BY A.CRSPD_SETID, A.CRSPD_CUST_ID, F.ST_ID_NUM, F.ST_DT, A.BUSINESS_UNIT ,H.ASOF_DT, H.DUE_DT, A.ITEM, H.CONTRACT_NUM, D.DESCR, G.DESCR, C.NAME1 ,B.ADDRESS1, B.ADDRESS2, B.ADDRESS3, B.ADDRESS4, B.CITY, B.STATE ,B.POSTAL, A.BAL_CURRENCY, A.CUST_ID, A.ENTRY_TYPE ,25, A.ENTRY_REASON, C.CUSTOMER_TYPE, K.AR_LVL, H.ORDER_NO UNION ALL  SELECT A.CRSPD_SETID, A.CRSPD_CUST_ID, F.ST_ID_NUM as STMT_NBR, F.ST_DT, A.BUSINESS_UNIT, H.ASOF_DT, H.DUE_DT, A.ITEM, H.CONTRACT_NUM, D.DESCR as ENTRY_TYPE_DESCR, G.DESCR as ENTRY_REASON_DESCR, SUM(A.BAL_AMT) as ORIG_BAL_AMT, SUM(H.BAL_AMT), C.NAME1, B.ADDRESS1, B.ADDRESS2, B.ADDRESS3, B.ADDRESS4, B.CITY, B.STATE, B.POSTAL, A.BAL_CURRENCY, A.CUST_ID, A.ENTRY_TYPE as ORIG_ENTRY_TYPE, CASE WHEN A.ENTRY_TYPE = 'PY' OR A.ENTRY_TYPE = 'BGB' THEN 'AA' || substr(A.ENTRY_TYPE,1,3) ELSE  substr(A.ENTRY_TYPE,1,3) END, A.ENTRY_REASON as ORIG_ENTRY_REASON, C.CUSTOMER_TYPE, K.AR_LVL, H.ORDER_NO FROM PS_AR_STMT_CUSDT_H A, PS_CUST_ADDRESS B, PS_CUSTOMER C, PS_SET_CNTRL_REC E, PS_AR_STMT_CUST_H F, PS_ENTRY_TYPE_TBL D, PS_ENTRY_REASN_TBL G, outer PS_AR_ITEM_H H, outer PS_BI_TYPE K WHERE A.ADDRESS_SEQ_NUM = B.ADDRESS_SEQ_NUM AND B.EFFDT = (SELECT MAX(B_ED.EFFDT) FROM PS_CUST_ADDRESS B_ED Where B.SETID = B_ED.SETID AND B.CUST_ID = B_ED.CUST_ID AND B.ADDRESS_SEQ_NUM = B_ED.ADDRESS_SEQ_NUM AND B_ED.EFFDT <=  '06/19/2013') AND A.CRSPD_SETID = B.SETID AND A.CRSPD_CUST_ID = B.CUST_ID AND B.SETID = C.SETID AND B.CUST_ID = C.CUST_ID AND B.ADDRESS_SEQ_NUM = C.ADDRESS_SEQ_NUM AND G.ENTRY_TYPE = A.ENTRY_TYPE AND G.ENTRY_REASON = A.ENTRY_REASON AND G.SETID = E.SETID AND G.SETID = D.SETID AND G.ENTRY_TYPE = D.ENTRY_TYPE AND E.SETCNTRLVALUE = A.BUSINESS_UNIT AND E.RECNAME = 'ENTRY_TYPE_TBL' AND A.CRSPD_SETID = F.CRSPD_SETID AND A.CRSPD_CUST_ID = F.CRSPD_CUST_ID AND A.ST_ID_NUM = F.ST_ID_NUM AND A.BUSINESS_UNIT = H.BUSINESS_UNIT AND A.CUST_ID = H.CUST_ID AND A.ITEM = H.ITEM AND A.ITEM_LINE = H.ITEM_LINE AND substr(A.ENTRY_TYPE,1,3) = K.BILL_TYPE_ID AND K.SETID = 'SPN' AND K.EFFDT = (SELECT MAX(C_ED.EFFDT) FROM PS_BI_TYPE C_ED WHERE K.SETID = C_ED.SETID AND K.BILL_TYPE_ID = C_ED.BILL_TYPE_ID AND C_ED.EFFDT <=  '06/19/2013') AND K.EFF_STATUS = 'A' AND A.CRSPD_CUST_ID =  '000331' AND A.CRSPD_SETID = 'SPN' AND F.ST_DT = '' AND F.ST_ID_NUM = '' GROUP BY A.CRSPD_SETID, A.CRSPD_CUST_ID, F.ST_ID_NUM, F.ST_DT, A.BUSINESS_UNIT ,H.ASOF_DT, H.DUE_DT, A.ITEM, H.CONTRACT_NUM, D.DESCR, G.DESCR, C.NAME1 ,B.ADDRESS1, B.ADDRESS2, B.ADDRESS3, B.ADDRESS4, B.CITY, B.STATE ,B.POSTAL, A.BAL_CURRENCY, A.CUST_ID, A.ENTRY_TYPE ,25, A.ENTRY_REASON, C.CUSTOMER_TYPE, K.AR_LVL, H.ORDER_NO ORDER BY 2,3,4,25,8,11,24

我是否纠正OUTER只是LEFT OUTER JOIN的简写(也许是Informix风格的简写?

UPDATE:我发现here Informix did实际上使用了OUTER,但是我还没有找到关于how的任何解释。显然,搜索结果压倒性地支持包含普通语法的内容。甚至this very useful RDBMS comparison几乎都不包含Informix。

这是格式化的SQL(抱歉,大小!):

SELECT A.CRSPD_SETID,
       A.CRSPD_CUST_ID,
       F.ST_ID_NUM AS STMT_NBR,
       F.ST_DT,
       A.BUSINESS_UNIT,
       H.ASOF_DT,
       H.DUE_DT,
       A.ITEM,
       H.CONTRACT_NUM,
       D.DESCR AS ENTRY_TYPE_DESCR,
       G.DESCR AS ENTRY_REASON_DESCR,
       SUM(A.BAL_AMT) AS ORIG_BAL_AMT,
       SUM(H.BAL_AMT),
       C.NAME1,
       B.ADDRESS1,
       B.ADDRESS2,
       B.ADDRESS3,
       B.ADDRESS4,
       B.CITY,
       B.STATE,
       B.POSTAL,
       A.BAL_CURRENCY,
       A.CUST_ID,
       A.ENTRY_TYPE AS ORIG_ENTRY_TYPE,
       CASE
           WHEN A.ENTRY_TYPE = 'PY'
                OR A.ENTRY_TYPE = 'BGB' THEN 'AA' || substr(A.ENTRY_TYPE,1,3)
           ELSE substr(A.ENTRY_TYPE,1,3)
       END,
       A.ENTRY_REASON AS ORIG_ENTRY_REASON,
       C.CUSTOMER_TYPE,
       K.AR_LVL,
       H.ORDER_NO
FROM PS_STMT_CUST_DTL A,
     PS_CUST_ADDRESS B,
     PS_CUSTOMER C,
     PS_SET_CNTRL_REC E,
     PS_STMT_CUST F,
     PS_ENTRY_TYPE_TBL D,
     PS_ENTRY_REASN_TBL G,
     OUTER PS_ITEM H,
           OUTER PS_BI_TYPE K
WHERE A.ADDRESS_SEQ_NUM = B.ADDRESS_SEQ_NUM
  AND B.EFFDT =
    (SELECT MAX(B_ED.EFFDT)
     FROM PS_CUST_ADDRESS B_ED
     WHERE B.SETID = B_ED.SETID
       AND B.CUST_ID = B_ED.CUST_ID
       AND B.ADDRESS_SEQ_NUM = B_ED.ADDRESS_SEQ_NUM
       AND B_ED.EFFDT <= '06/19/2013')
  AND A.CRSPD_SETID = B.SETID
  AND A.CRSPD_CUST_ID = B.CUST_ID
  AND B.SETID = C.SETID
  AND B.CUST_ID = C.CUST_ID
  AND B.ADDRESS_SEQ_NUM = C.ADDRESS_SEQ_NUM
  AND G.ENTRY_TYPE = A.ENTRY_TYPE
  AND G.ENTRY_REASON = A.ENTRY_REASON
  AND G.SETID = E.SETID
  AND G.SETID = D.SETID
  AND G.ENTRY_TYPE = D.ENTRY_TYPE
  AND E.SETCNTRLVALUE = A.BUSINESS_UNIT
  AND E.RECNAME = 'ENTRY_TYPE_TBL'
  AND A.CRSPD_SETID = F.CRSPD_SETID
  AND A.CRSPD_CUST_ID = F.CRSPD_CUST_ID
  AND A.ST_ID_NUM = F.ST_ID_NUM
  AND A.BUSINESS_UNIT = H.BUSINESS_UNIT
  AND A.CUST_ID = H.CUST_ID
  AND A.ITEM = H.ITEM
  AND A.ITEM_LINE = H.ITEM_LINE
  AND substr(A.ENTRY_TYPE,1,3) = K.BILL_TYPE_ID
  AND K.SETID = 'SPN'
  AND K.EFFDT =
    (SELECT MAX(C_ED.EFFDT)
     FROM PS_BI_TYPE C_ED
     WHERE K.SETID = C_ED.SETID
       AND K.BILL_TYPE_ID = C_ED.BILL_TYPE_ID
       AND C_ED.EFFDT <= '06/19/2013')
  AND K.EFF_STATUS = 'A'
  AND A.CRSPD_CUST_ID = '000331'
  AND A.CRSPD_SETID = 'SPN'
  AND F.ST_DT = ''
  AND F.ST_ID_NUM = ''
GROUP BY A.CRSPD_SETID,
         A.CRSPD_CUST_ID,
         F.ST_ID_NUM,
         F.ST_DT,
         A.BUSINESS_UNIT ,
         H.ASOF_DT,
         H.DUE_DT,
         A.ITEM,
         H.CONTRACT_NUM,
         D.DESCR,
         G.DESCR,
         C.NAME1 ,
         B.ADDRESS1,
         B.ADDRESS2,
         B.ADDRESS3,
         B.ADDRESS4,
         B.CITY,
         B.STATE ,
         B.POSTAL,
         A.BAL_CURRENCY,
         A.CUST_ID,
         A.ENTRY_TYPE ,
         25,
         A.ENTRY_REASON,
         C.CUSTOMER_TYPE,
         K.AR_LVL,
         H.ORDER_NO
UNION ALL
SELECT A.CRSPD_SETID,
       A.CRSPD_CUST_ID,
       F.ST_ID_NUM AS STMT_NBR,
       F.ST_DT,
       A.BUSINESS_UNIT,
       H.ASOF_DT,
       H.DUE_DT,
       A.ITEM,
       H.CONTRACT_NUM,
       D.DESCR AS ENTRY_TYPE_DESCR,
       G.DESCR AS ENTRY_REASON_DESCR,
       SUM(A.BAL_AMT) AS ORIG_BAL_AMT,
       SUM(H.BAL_AMT),
       C.NAME1,
       B.ADDRESS1,
       B.ADDRESS2,
       B.ADDRESS3,
       B.ADDRESS4,
       B.CITY,
       B.STATE,
       B.POSTAL,
       A.BAL_CURRENCY,
       A.CUST_ID,
       A.ENTRY_TYPE AS ORIG_ENTRY_TYPE,
       CASE
           WHEN A.ENTRY_TYPE = 'PY'
                OR A.ENTRY_TYPE = 'BGB' THEN 'AA' || substr(A.ENTRY_TYPE,1,3)
           ELSE substr(A.ENTRY_TYPE,1,3)
       END,
       A.ENTRY_REASON AS ORIG_ENTRY_REASON,
       C.CUSTOMER_TYPE,
       K.AR_LVL,
       H.ORDER_NO
FROM PS_AR_STMT_CUSDT_H A,
     PS_CUST_ADDRESS B,
     PS_CUSTOMER C,
     PS_SET_CNTRL_REC E,
     PS_AR_STMT_CUST_H F,
     PS_ENTRY_TYPE_TBL D,
     PS_ENTRY_REASN_TBL G,
     OUTER PS_AR_ITEM_H H,
           OUTER PS_BI_TYPE K
WHERE A.ADDRESS_SEQ_NUM = B.ADDRESS_SEQ_NUM
  AND B.EFFDT =
    (SELECT MAX(B_ED.EFFDT)
     FROM PS_CUST_ADDRESS B_ED
     WHERE B.SETID = B_ED.SETID
       AND B.CUST_ID = B_ED.CUST_ID
       AND B.ADDRESS_SEQ_NUM = B_ED.ADDRESS_SEQ_NUM
       AND B_ED.EFFDT <= '06/19/2013')
  AND A.CRSPD_SETID = B.SETID
  AND A.CRSPD_CUST_ID = B.CUST_ID
  AND B.SETID = C.SETID
  AND B.CUST_ID = C.CUST_ID
  AND B.ADDRESS_SEQ_NUM = C.ADDRESS_SEQ_NUM
  AND G.ENTRY_TYPE = A.ENTRY_TYPE
  AND G.ENTRY_REASON = A.ENTRY_REASON
  AND G.SETID = E.SETID
  AND G.SETID = D.SETID
  AND G.ENTRY_TYPE = D.ENTRY_TYPE
  AND E.SETCNTRLVALUE = A.BUSINESS_UNIT
  AND E.RECNAME = 'ENTRY_TYPE_TBL'
  AND A.CRSPD_SETID = F.CRSPD_SETID
  AND A.CRSPD_CUST_ID = F.CRSPD_CUST_ID
  AND A.ST_ID_NUM = F.ST_ID_NUM
  AND A.BUSINESS_UNIT = H.BUSINESS_UNIT
  AND A.CUST_ID = H.CUST_ID
  AND A.ITEM = H.ITEM
  AND A.ITEM_LINE = H.ITEM_LINE
  AND substr(A.ENTRY_TYPE,1,3) = K.BILL_TYPE_ID
  AND K.SETID = 'SPN'
  AND K.EFFDT =
    (SELECT MAX(C_ED.EFFDT)
     FROM PS_BI_TYPE C_ED
     WHERE K.SETID = C_ED.SETID
       AND K.BILL_TYPE_ID = C_ED.BILL_TYPE_ID
       AND C_ED.EFFDT <= '06/19/2013')
  AND K.EFF_STATUS = 'A'
  AND A.CRSPD_CUST_ID = '000331'
  AND A.CRSPD_SETID = 'SPN'
  AND F.ST_DT = ''
  AND F.ST_ID_NUM = ''
GROUP BY A.CRSPD_SETID,
         A.CRSPD_CUST_ID,
         F.ST_ID_NUM,
         F.ST_DT,
         A.BUSINESS_UNIT ,
         H.ASOF_DT,
         H.DUE_DT,
         A.ITEM,
         H.CONTRACT_NUM,
         D.DESCR,
         G.DESCR,
         C.NAME1 ,
         B.ADDRESS1,
         B.ADDRESS2,
         B.ADDRESS3,
         B.ADDRESS4,
         B.CITY,
         B.STATE ,
         B.POSTAL,
         A.BAL_CURRENCY,
         A.CUST_ID,
         A.ENTRY_TYPE ,
         25,
         A.ENTRY_REASON,
         C.CUSTOMER_TYPE,
         K.AR_LVL,
         H.ORDER_NO
ORDER BY 2,
         3,
         4,
         25,
         8,
         11,
         24
sql informix
3个回答
1
投票

Informix风格的OUTER联接不仅仅是LEFT OUTER JOIN的捷径,而是将其视为中等程度的近似值。有很多细节为什么它不是那么简单。

Informix OUTER Joins有在线说明,其中一些比示例中的查询复杂得多。

将UNION查询的前半部分转换为更现代的表示法,您将得到:

SELECT A.CRSPD_SETID,
       A.CRSPD_CUST_ID,
       F.ST_ID_NUM AS STMT_NBR,
       F.ST_DT,
       A.BUSINESS_UNIT,
       H.ASOF_DT,
       H.DUE_DT,
       A.ITEM,
       H.CONTRACT_NUM,
       D.DESCR AS ENTRY_TYPE_DESCR,
       G.DESCR AS ENTRY_REASON_DESCR,
       SUM(A.BAL_AMT) AS ORIG_BAL_AMT,
       SUM(H.BAL_AMT),
       C.NAME1,
       B.ADDRESS1,
       B.ADDRESS2,
       B.ADDRESS3,
       B.ADDRESS4,
       B.CITY,
       B.STATE,
       B.POSTAL,
       A.BAL_CURRENCY,
       A.CUST_ID,
       A.ENTRY_TYPE AS ORIG_ENTRY_TYPE,
       CASE
           WHEN A.ENTRY_TYPE = 'PY'
                OR A.ENTRY_TYPE = 'BGB' THEN 'AA' || substr(A.ENTRY_TYPE,1,3)
           ELSE substr(A.ENTRY_TYPE,1,3)
       END,
       A.ENTRY_REASON AS ORIG_ENTRY_REASON,
       C.CUSTOMER_TYPE,
       K.AR_LVL,
       H.ORDER_NO
  FROM PS_STMT_CUST_DTL A
  JOIN PS_CUST_ADDRESS B
    ON A.ADDRESS_SEQ_NUM = B.ADDRESS_SEQ_NUM AND
       A.CRSPD_SETID = B.SETID AND
       A.CRSPD_CUST_ID = B.CUST_ID
  JOIN PS_CUSTOMER C
    ON B.SETID = C.SETID AND
       B.CUST_ID = C.CUST_ID AND
       B.ADDRESS_SEQ_NUM = C.ADDRESS_SEQ_NUM
  JOIN PS_SET_CNTRL_REC E
    ON E.SETCNTRLVALUE = A.BUSINESS_UNIT AND
       E.RECNAME = 'ENTRY_TYPE_TBL'
  JOIN PS_STMT_CUST F
    ON A.CRSPD_SETID = F.CRSPD_SETID AND
       A.CRSPD_CUST_ID = F.CRSPD_CUST_ID AND
       A.ST_ID_NUM = F.ST_ID_NUM
  JOIN PS_ENTRY_REASN_TBL G
    ON G.ENTRY_TYPE = A.ENTRY_TYPE AND
       G.ENTRY_REASON = A.ENTRY_REASON AND
       G.SETID = E.SETID AND
  JOIN PS_ENTRY_TYPE_TBL D
    ON G.SETID = D.SETID AND
       G.ENTRY_TYPE = D.ENTRY_TYPE
  LEFT OUTER JOIN PS_ITEM H
    ON A.BUSINESS_UNIT = H.BUSINESS_UNIT AND
       A.CUST_ID = H.CUST_ID AND
       A.ITEM = H.ITEM AND
       A.ITEM_LINE = H.ITEM_LINE
  LEFT OUTER JOIN PS_BI_TYPE K
    ON SUBSTR(A.ENTRY_TYPE,1,3) = K.BILL_TYPE_ID
 WHERE B.EFFDT =
       (SELECT MAX(B_ED.EFFDT)
          FROM PS_CUST_ADDRESS B_ED
         WHERE B.SETID = B_ED.SETID
           AND B.CUST_ID = B_ED.CUST_ID
           AND B.ADDRESS_SEQ_NUM = B_ED.ADDRESS_SEQ_NUM
           AND B_ED.EFFDT <= '06/19/2013')
   AND K.SETID = 'SPN'
   AND K.EFFDT =
       (SELECT MAX(C_ED.EFFDT)
          FROM PS_BI_TYPE C_ED
         WHERE K.SETID = C_ED.SETID
           AND K.BILL_TYPE_ID = C_ED.BILL_TYPE_ID
           AND C_ED.EFFDT <= '06/19/2013')
   AND K.EFF_STATUS = 'A'
   AND A.CRSPD_CUST_ID = '000331'
   AND A.CRSPD_SETID = 'SPN'
   AND F.ST_DT = ''
   AND F.ST_ID_NUM = ''
 GROUP BY A.CRSPD_SETID,
          A.CRSPD_CUST_ID,
          F.ST_ID_NUM,
          F.ST_DT,
          A.BUSINESS_UNIT ,
          H.ASOF_DT,
          H.DUE_DT,
          A.ITEM,
          H.CONTRACT_NUM,
          D.DESCR,
          G.DESCR,
          C.NAME1 ,
          B.ADDRESS1,
          B.ADDRESS2,
          B.ADDRESS3,
          B.ADDRESS4,
          B.CITY,
          B.STATE,
          B.POSTAL,
          A.BAL_CURRENCY,
          A.CUST_ID,
          A.ENTRY_TYPE,
          25,
          A.ENTRY_REASON,
          C.CUSTOMER_TYPE,
          K.AR_LVL,
          H.ORDER_NO

这是相当复杂的,因为表的数量众多且多列连接条件。但是,外部联接结构是直接的-两个外部联接都直接与主表PS_STMT_CUST_DTL相关,该主表的别名为A。

我相当确定可以简化SQL。例如,在编写时,Informix可能不支持“ FROM子句中的子查询”。但是这两个SUM值可能放在子查询中,这将简化GROUP BY子句(从主查询中删除它)。


1
投票

我是否纠正OUTER只是简写(也许是Informix风格的简写)以用于LEFT OUTER JOIN?

是的,您完全正确。

引用Informix-4GL Reference Manual

查询1-使用简单联接

SELECT customer.customer_num, lname, order_num
    FROM customer, orders
    WHERE customer.customer_num = orders.order_num

查询2-使用外部联接

SELECT customer.customer_num, lname, order_num
    FROM customer, OUTER orders
    WHERE customer.customer_num = orders.customer_num

在Informix中,将OUTER放在可以包含空值的表的前面时,将联接指定为外部联接。


1
投票

有关Informix外部语法的信息:http://pic.dhe.ibm.com/infocenter/idshelp/v117/index.jsp?topic=%2Fcom.ibm.sqls.doc%2Fsqls.htm

IBM的时髦文档不允许直接链接,因此请在其中搜索OUTER。

这是针对Informix 11.7,不确定所使用的版本。

基本上,外部表在where子句中处于任何联接条件下都是从属表,并且实际上是外部联接。还请注意,在from子句中指定表的顺序对于Informix语法而言很重要。

© www.soinside.com 2019 - 2024. All rights reserved.