如何在 IBM Informix 10.0 中使用子查询

How to use Sub Query with IBM Informix 10.0

RDBMS 是 INFORMIX 10.0

SELECT owner FROM systables WHERE TABNAME= ' VERSION';

Returns 9.50C1(相当于版本 10.x)

子查询工作正常:

SELECT acct.fund_acct_nbr, acct.bin, prod.issuer_id, COUNT(*)
FROM fund_acct AS acct
JOIN products AS prod ON acct.cusip = prod.cusip
WHERE prod.issuer_id = 'xxxx'
AND SUBSTR(acct.bin, 1, 1) = 'x'
GROUP BY acct.fund_acct_nbr, acct.bin, prod.issuer_id;

我想将此查询用作子查询。

So my question is:

How do I get this done on IBM INFORMIX v10.0?
Should be simple and straight forward right?

任何将该查询用作子查询的尝试都会生成这条有意义的消息:

“查询失败 => 2”

INFORMIX - 没有“WITH”子句,所以这不起作用:

WITH issuer_accts AS
(
SELECT acct.fund_acct_nbr, acct.bin, prod.issuer_id, COUNT(*)
FROM fund_acct AS acct
JOIN products AS prod ON acct.cusip = prod.cusip
WHERE prod.issuer_id = 'xxxx'
AND SUBSTR(acct.bin, 1, 1) = 'x'
GROUP BY acct.fund_acct_nbr, acct.bin, prod.issuer_id
)
SELECT issuer_accts.issuer_id, COUNT(*)
FROM issuer_accts
GROUP BY issuer_accts.issuer_id;

尝试效仿这个例子(IBM documentation):

SELECT issuer_id, COUNT(*)
FROM 
(
SELECT acct.fund_acct_nbr, acct.bin, prod.issuer_id, COUNT(*)
FROM fund_acct AS acct
JOIN products AS prod ON acct.cusip = prod.cusip
WHERE prod.issuer_id = 'xxxx'
AND SUBSTR(acct.bin, 1, 1) = 'x'
GROUP BY acct.fund_acct_nbr, acct.bin, prod.issuer_id
) issuer_accts
GROUP BY issuer_id;

尝试效仿这个例子(specific to INFORMIX v10.0)

SELECT issuer_id, COUNT(*)
FROM 
TABLE(MULTISET(
SELECT acct.fund_acct_nbr, acct.bin, prod.issuer_id, COUNT(*)
FROM fund_acct AS acct
JOIN products AS prod ON acct.cusip = prod.cusip
WHERE prod.issuer_id = 'xxxx'
AND SUBSTR(acct.bin, 1, 1) = 'x'
GROUP BY acct.fund_acct_nbr, acct.bin, prod.issuer_id
)) 
GROUP BY issuer_id;

我想你只需要一个别名:

SELECT issuer_id, COUNT(*)
FROM (SELECT acct.fund_acct_nbr, acct.bin, prod.issuer_id, COUNT(*) as cnt
      FROM fund_acct AS acct JOIN
           products AS prod
           ON acct.cusip = prod.cusip
      WHERE prod.issuer_id = 'xxxx' AND SUBSTR(acct.bin, 1, 1) = 'x'
      GROUP BY acct.fund_acct_nbr, acct.bin, prod.issuer_id
     ) x
GROUP BY issuer_id;

但是,根据对数据的最合理假设,您也可以这样表述:

SELECT issuer_id, COUNT(DISTINCT acct.bin || ' ' || prod.issuer_id)
FROM fund_acct AS acct JOIN
     products AS prod
     ON acct.cusip = prod.cusip
WHERE prod.issuer_id = 'xxxx' AND SUBSTR(acct.bin, 1, 1) = 'x'
GROUP BY issuer_id;

因为Informix v10这个早期版本不支持"Sub Query"/"Inline Query"/"Inner Query"那么常规做法是使用TEMP表来支持复杂的sql语句.因此,这是此版本的 IBM Informix v10 的有效答案:

SELECT acct.fund_acct_nbr, acct.bin, prod.issuer_id, COUNT(*)
FROM fund_acct AS acct
JOIN products AS prod ON acct.cusip = prod.cusip
WHERE prod.issuer_id = 'xxxx'
AND SUBSTR(acct.bin, 1, 1) = 'x'
GROUP BY acct.fund_acct_nbr, acct.bin, prod.issuer_id
INTO TEMP temp_issuer_accts WITH NO LOG;

SELECT issuer_id, COUNT(*) account_count
FROM temp_issuer_accts
GROUP BY issuer_id;

DROP TABLE temp_issuer_accts;

临时表仅在会话期间存在 - 因此请确保您的连接在执行多个语句时保持打开状态。

相关参考在这里:

INTO TEMP clause

Using the WITH NO LOG option

Explicit inserts with SELECT...INTO TEMP statements

Duration of temporary tables