2017-08-16 73 views
0

RDBMS是INFORMIX 10.0如何使用子查詢與IBM的Informix 10.0

SELECT owner FROM systables WHERE TABNAME= ' VERSION'; 

返回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; 
+0

注意的Informix 10.00是長時間在外的支持。理想情況下,你應該升級到更新的版本 - 在這個階段,應該是12.10(過去幾年,它可能是11.10,11.50或11.70,但現在只有11.70是一個理論選項,不應該選擇) 。 –

+0

請注意,即使12.10不支持WITH子句。使用10.00服務器的12.10語法圖不能保證令人高興 - 您需要10.00手冊,這些手冊可從https://www-01.ibm.com/support/docview.wss?uid=swg27039629獲取,一個頁面,記錄2010年10.00到達EOS(服務結束)。 –

+0

你使用什麼工具生成'Failed queries => 2'消息?我不記得曾經看到過,這可能意味着我很幸運。 –

回答

0

因爲Informix v10的這個早期版本不支持「Sub Query」/「Inline Que ry「/」內部查詢「,那麼常規做法是使用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

1

我想你只需要一個別名:

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; 
+0

我確實嘗試過這種變化(並且再次嘗試一下),但它仍然會生成相同的錯誤:「失敗的查詢=> 2」。我也嘗試了您的替代建議,但它會產生以下消息:「發生了一個sytax錯誤。」 – Threadid

+0

在11.x發行版系列中,「FROM(SELECT ...)」符號被添加到Informix中 - 大概是11.50。它在Informix 10.00中不起作用。 –

+0

第一個查詢需要在刪除內部GROUP BY子句中的prod.issuer_id後使用分號。然而,即使這會使其在當前版本的Informix中起作用(或者至少會給它一個相當好的工作機會),但它可能不會幫助像10.00那樣的舊版本,它不支持'sub在FROM子句中查詢'。 –