2017-06-06 5 views
0

私の問題は次のとおりです。変数にIDのリストを設定し、この変数をサブクエリで使用します。問題は、WorkBench(私のGUI)が次のエラーを返すことです: "複数の行を返す副問い合わせ"。それは私が思うものです。
私が間違っているところを教えてください。サブクエリ内の変数にリストを設定する - MYSQL

これは私のクエリです:

set @listID := (select ID_VOIE as ID from voies 
    where ORIGINE = 'XXX' 
    group by CODE_INSEE, CODE_VOIE 
    having count(*) > 1); 

select substring(v.CODE_INSEE,1,2), count(*) from voies v 
    where v.ID_VOIE in (@listID) 
    group by substring(vs.CODE_INSEE,1,2); 

事が私は「によってグループ」で封鎖されていますが、私はなぜ私はできない(またはそれはだ、で最初のグループの後でgroupdを行いたいです少なくとも私は方法を見つけることができませんでした)単一のWHERE句で要求を書きます。

事は、私が代わりに変数を使用しますが、私のサブクエリに直接リクエスト全体を置くことができることを知っている:

  • それは私がDRY(この動作を必要に応じて別のリクエストでこのトリックを使用させることができます!コンセプト)
  • 私はよく分からないが、サブクエリは私のループの各ターンで実行され、それが

非常に非効率的になりますので、私は2つの可能な方法を模索:私が使ってみましょう道をvarにリストするサブクエリでiableを使用する方法、または1つのクエリで2回「group by」を使用する方法です。

あらかじめお返事ありがとうございます(私の英語では申し訳ありませんが、これは母国語ではありません)。あなたが何か他のもののためにその変数を必要とする場合を除き

+0

この種の問題は、貧しいデザインの症候性です。 – Strawberry

+0

「デザインが悪い」ということをもう少し明示することができればいいと思います。 –

+0

正規化を参照してください。 – Strawberry

答えて

1

、あなたは次のように完全にそれをスキップすることができるはずです:

あなたが言うように
SELECT 
    SUBSTRING(v.CODE_INSEE,1,2), 
    COUNT(*) 
FROM 
    voies v 
WHERE 
    v.ID_VOIE in 
    (SELECT 
     ID_VOIE as ID 
    FROM 
     voies 
    WHERE 
     ORIGINE = 'XXX' 
    GROUP BY 
     CODE_INSEE, 
     CODE_VOIE 
    HAVING COUNT(*) > 1) 
GROUP BY 
    SUBSTRING(vs.CODE_INSEE,1,2); 

、サブクエリは、すべての行に対して実行されます。これを避けるには、変数が最適ですが、MySQLはテーブル変数をサポートしていません。代わりに、一時テーブルを使用することができます

IF EXISTS DROP TABLE myTempTable; 
CREATE TEMPORARY TABLE myTempTable (ID_VOIE int); -- I don't know the datatype 
INSERT INTO myTempTable (ID_VOIE) 
SELECT DISTINCT -- using distinct so I can join instead of use IN. 
    ID_VOIE as ID from voies 
WHERE 
    ORIGINE = 'XXX' 
GROUP BY 
    CODE_INSEE, CODE_VOIE 
HAVING COUNT(*) > 1 

をそして今、あなたはこれを行うことができます。

SELECT 
    SUBSTRING(v.CODE_INSEE,1,2), COUNT(*) 
FROM 
    voies v 
    JOIN myTempTable tt ON 
     v.ID_VOIE = tt.ID_VOIE 
GROUP BY SUBSTRING(vs.CODE_INSEE,1,2); 
+0

これは私が "私のサブクエリに変数を使用するのではなく、リクエスト全体を直接入れることができるということです。 ここで私は必要以上のものを置かなかったが、私はこの結果を何倍も必要とする。 とにかくお返事ありがとうございます。 –

+0

編集:あなたのアップデートはすばらしければ、私はそれを試してみようと思っています。 –

+0

最終編集:リクエストがうまくいっていると思っています。すべてのためのThx! WorkBenchが "この位置で無効な入力"と言ったので、私は3IF "ステートメントを消去しなければならなかった –

関連する問題