我继承了一些<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
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子句(从主查询中删除它)。
我是否纠正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放在可以包含空值的表的前面时,将联接指定为外部联接。
有关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语法而言很重要。