如何在 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;
临时表仅在会话期间存在 - 因此请确保您的连接在执行多个语句时保持打开状态。
相关参考在这里:
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;
临时表仅在会话期间存在 - 因此请确保您的连接在执行多个语句时保持打开状态。
相关参考在这里: