2010-12-02 22 views
0

テーブル「アカウント」とは異なるIDを持つLIST(クエリ出力)があります。 そのLISTを使用して、私はSELECTクエリをループしていて、基本的にいくつかのCOUNTを抽出しています。 個別にCOUNT値を取得するのに問題があります。 「アカウント」LISTを使用して必要な出力を取得できません。<cfloop>および<cfquery>

テーブルはフィールド 1)contract_ID、
2)vAccountID(プライマリキー)と 3)STATUS_ID(値=」」、V、C)を有しています。

私は次のクエリに

<cfquery name="qryGetid" datasource="#datasource#"> 
SELECT DISTINCT(contract_ID) 
FROM Account 
    ORDER BY contract_ID DESC 
</cfquery> 


<!--- account details for each ---> 
<cfset Z =#ValueList(qryGetid.ID)# > 
<cfloop list="#Z#" index="Y" > 
<cfquery name="qryGetNiceAccounts" datasource="#dataSource#"> 
SELECT 
DISTINCT(a.contract_ID) 
,(SELECT count(vAccountID) FROM Account 
     WHERE c _ID IN (<cfqueryparam value="#x#" list="yes" cfsqltype="cf_sql_integer" separator=",">) 
     AND Status_id = 'V') AS Valid_AcntV 
,(SELECT count(vAccountID) FROM Account 
     WHERE c _ID IN (<cfqueryparam value="#x#" list="yes" cfsqltype="cf_sql_integer" separator=",">) 
     AND Status_id = 'C') AS Valid_AcntC 

    FROM Account a 
    WHERE 
a.contract_ID IN (<cfqueryparam value="#x#" list="yes" cfsqltype="cf_sql_integer" separator="," >) 
ORDER BY contract_ID DESC 

</cfquery> 

クエリをやっている=「qryGetNiceAccountsは」のリストにも、さまざまな「C_ID」のための「Valid_AcntCount」のために一つの値だけを返しています。

例「アカウント」の表では、基本的に私はトラブルの個別IDのカウントを取得したのです値

contract_ID  count(vID)/ v_Accoun t=’v’  count(vID)/ v_Accoun t=’c’ 

    123   10             220 
    124   05             110 
    123   01              0 

contract_ID count(vID)/ v_Accoun t=’v’  count(vID)/ v_Accoun t=’c’ 
    123   10             220 
    124   10             220 
    123   10             220 

を持っている場合。

サイドノート:私は入力「contract_IDは」123、123 123よりもむしろ123124125

+1

を実行すると、何が表示されますか? – charliegriefer

+1

サイドノート:なぜクエリ自体をループすることができるときに、クエリから 'ValueList()'をループするのですか? – Tomalak

答えて

2

[...]このリストを使用して、SELECTクエリでループしており、基本的にいくつかのCOUNTを抽出しています。 [...]

これは一般的には悪い考えです。特に「いくつかのカウントを取得する」は、SQLで直接行うのが最も簡単な作業の1つで、ループ内でSELECTクエリを実行する理由がない場合よりも頻繁に実行されます。パフォーマンス上の理由から可能な限り避けてください。

そして、あなたの場合には、それは完全に回避可能だ(それもあなたのコードはずっと簡単になり)、ちょうどあなたのSQLを変更します。

<cfquery name="qryGetNiceAccounts" datasource="#dataSource#"> 
    SELECT 
    contract_ID, 
    (SELECT COUNT(vAccountID) FROM v_Account 
     WHERE c_ID = a.contract_ID AND Status_id = 'V' 
    ) AS Valid_AcntV, 
    (SELECT COUNT(vAccountID) FROM v_Account 
     WHERE c_ID = a.contract_ID AND Status_id = 'C' 
    ) AS Valid_AcntC 
    FROM 
    (SELECT contract_ID FROM Account GROUP BY contract_ID) AS a 
    ORDER BY 
    contract_ID DESC 
</cfquery> 

あなたは他のすべてのクエリを必要はありません、どちらもあなたが必要なのですループ。

同じことを表現するための別の方法は、これを次のようになります。

SELECT 
    a.contract_ID, 
    SUM(CASE Status_id WHEN 'V' THEN 1 ELSE 0 END) AS Valid_AcntV, 
    SUM(CASE Status_id WHEN 'C' THEN 1 ELSE 0 END) AS Valid_AcntC 
FROM 
    Account AS a 
    INNER JOIN v_Account AS c ON c.c_id = a.contract_ID 
GROUP BY 
    a.contract_ID 
ORDER BY 
    a.contract_ID DESC 

これは一度だけv_Accountビューを打つでしょう。あなたは最も効率的なクエリが何であるかを判断する必要があります。

4

として表示されるダンプを行う-When私はあなたがそれを過度に複雑だと思うし、それが持つ単一のクエリを解決することができますいくつかの結合:

 
SELECT 
    a.contract_ID, 
    COUNT(vav.vAccountID) AS Valid_AcntV, 
    COUNT(vac.vAccountID) AS Valid_AcntC 
FROM Account a 
LEFT JOIN v_Account AS vav 
    ON vav.c_ID = a.contract_ID AND vav.Status_id = 'V' 
LEFT JOIN v_Account AS vac 
    ON vac.c_ID = a.contract_ID AND vac.Status_id = 'C' 
GROUP BY a.contract_ID 
ORDER BY a.contract_ID DESC 

正しく照会を解読している場合は、後で何をする必要がありますか。

+1

+1これは、私のグループの最初の選択肢/選択カウントの後の方法に代わるものです。 – Tomalak

+0

ありがとう!しかし、私はテーブル "v_Account"を変更したことを言及したいと思います... "LEFT JOIN v_Account AS vav .." "Account"。 – Fransis

+0

基本的に自分自身に内部結合これはクエリを大きく遅くします。 – Fransis

関連する問題