2017-07-19 34 views
-1

を返す私は「Strobjednavka」この表の「DPH」を設定する必要がありますが、私はいただきました!間違って知っているドント。助けてください :)。ここでSQLサブクエリが複数の1行

は私のSQLスクリプトです:

UPDATE STRObjednavka as o SET dph = (
SELECT dph FROM STRCena WHERE 
    menuKodCode = 
    (SELECT menuKodCode FROM STRMenu WHERE 
     id = o.menuId 
     ) 
    AND 
    skupinaId = 
    (SELECT stravGroupId FROM grups1 WHERE 
     PKey = 
     (SELECT SGroup FROM users1 WHERE 
      PKey = o.userId 
     ))) 
    WHERE o.price > 0 AND `date` > '2015-01-28 13:52:36' AND dph = 0; 

SQLは言う:SQLエラー1242:副問合せは、あなたが以下のスクリプトで更新できることができます

+2

join not subqueries – Jens

+0

これは、https://stackoverflow.com/questions/28171474/solution-to-subquery-returns-more-than-1-row-errorの複製ではありません。ここでは、SETのスカラサブクエリaが使用されます。 – dnoeth

+0

サブクエリを再度確認してください。重複を削除できない場合(悪い方法)、サブクエリの最後にLIMIT 1を追加してください。または、同じ条件を「IN」に変更します。 – Vitaly

答えて

0

以上の1行を返しますが、次のものが必要更新が正しいかどうかをチェックするために、いくつかのサンプルデータを与えると、問題を追跡するのが簡単になります。

UPDATE STRObjednavka as o SET dph = (
SELECT max(dph) FROM STRCena WHERE 
    menuKodCode = 
    (SELECT max(menuKodCode) FROM STRMenu WHERE 
     id = o.menuId 
     ) 
    AND 
    skupinaId = 
    (SELECT max(stravGroupId) FROM grups1 WHERE 
     PKey = 
     (SELECT max(SGroup) FROM users1 WHERE 
      PKey = o.userId 
     ))) 
    WHERE o.price > 0 AND `date` > '2015-01-28 13:52:36' AND dph = 0; 
+0

それは動作します。このトピックの他の同じ答えのように動作している3 :) –

0

残念ながら、MySQLではサブクエリをLIMITにできません。ユースケースに応じて、サブクエリにMINまたはMAXを追加できます。あなたが本当に唯一の複数の行を返すだサブクエリに追加する必要がありますが

UPDATE STRObjednavka as o SET dph = (
SELECT MIN(dph) FROM STRCena WHERE 
    menuKodCode = 
    (SELECT MIN(menuKodCode) FROM STRMenu WHERE 
     id = o.menuId 
     ) 
    AND 
    skupinaId = 
    (SELECT MIN(stravGroupId) FROM grups1 WHERE 
     PKey = 
     (SELECT MIN(SGroup) FROM users1 WHERE 
      PKey = o.userId 
     ))) 
    WHERE o.price > 0 AND `date` > '2015-01-28 13:52:36' AND dph = 0; 

:ここでは、すべてのサブクエリでMIN秒です。

+0

<そんなにありがとう、とてもありがとう:) –

0

最初の問題は、「.... =(SELECT ....)」と書いていることです。等価演算子を使用しているので、SQLに値の列全体を1つのセルに割り当てるように要求しています。サブクエリの前に等価演算子をIN演算子に変更します。

+0

私はそれを試してみましたしかし、仕事していない –

0

おそらく別のクエリパターンを使用する必要があります。

あなたの質問には、いくつかの場所でこのようなことがあります。

WHERE menuKodCode =    /* !! might generate error 1242 */ 
    (SELECT menuKodCode FROM STRMenu WHERE id = o.menuId) 

は、あなたの内側のクエリが複数の行を返さないという保証はありませんし、それがないとき、MySQLは1242

SQLは、値のセットwiith作品エラーがスローされます。 =の代わりにINを使用した場合、クエリが機能します。

WHERE ... menuKodCode IN 
    (SELECT menuKodCode FROM STRMenu WHERE id = o.menuId) 

しかし、その論理が正しいかどうかを判断する必要があります。もし私があなただったら、UPDATEを行う前にそれをテストするためにたくさんのSELECT操作を行います。

+0

ええ私は代わりに=を試みた=しかし、仕事をしない –

関連する問題