1

私が尋ねているのと同様の質問の解決策を見つけましたが、これまでのところ私の問題を完全に解決したものはありません。少しの繰り返しがある場合はご容赦ください。

project、stage、function、m_char_2、idの各列を含むmeta_dataテーブルがあります。

meta_data
project |  stage    |  function  | m_char_2  |  id     |
 519    | reception |    notes   |  11/1272  | 2363827 |
 519    | reception | diagnosis_1|           | 2363827 |
 519    | reception |    notes   |  11/1278  | 2370589 |
 519    | reception | diagnosis_1|           | 2370589 |
 519    | reception |    notes   |           | 2398654 |
 519    | reception | diagnosis_1|  13/2586  | 2398654 |

対応するIDについて、関数値=notesの列m_char_2の値をm_char_2にコピーしたいと思います。ここで関数値=diagnostic_1です。

正常に機能する個々のIDに対してこれを実行できる構文を作成しました

UPDATE meta_data 
SET m_char_2 =
  (SELECT m_char_2
   FROM (SELECT * FROM meta_data) AS md
   WHERE
     md.stage ='Reception'
     AND md.function='Notes'
     AND md.id = 2363827)
WHERE
  project=519
  AND stage='Reception'
  AND function ='Diagnosis_1'
  AND id = 2363827;

ただし、複数のIDで機能させることはできません。更新するレコードが100を超えているので、IDエントリごとにクエリを実行する必要はありません。

これは動作しません:

UPDATE meta_data 
SET m_char_2 =
  (SELECT m_char_2
   FROM (SELECT * FROM meta_data) AS md
   WHERE
     md.stage ='Reception'
     AND md.function='Notes'
     AND md.id IN (2363827,2370589))
WHERE
  project=519
  AND stage='Reception'
  AND function ='Diagnosis_1'
  AND id IN (2363827,2370589);

エラーを返します#1242 subquery returns more than 1 row

助言がありますか?

4

2 に答える 2

2

ここで私はそれ自体と結合し、すべての行を次の値から取得した値meta_dataで更新しています。diagnosis_1notes

UPDATE
  meta_data m1 inner join meta_data m2
  on m1.id=m2.id
     and m1.project=m2.project
     and m1.stage=m2.stage
     and m1.function='Notes'
     and m2.function='diagnosis_1'
SET
  m2.m_char_2=m1.m_char_2
WHERE
  m1.project=519
  AND m1.stage='Reception'
  AND m1.id IN (2363827,2370589);

(このフィドルを参照してください)。'13/2586'のような既存の値も保持する必要がある場合は、次のような他の条件を追加することをお勧めします。

and (m2.m_char_2 IS NULL or LENGTH(m2.m_char_2)=0)
and m1.m_char_2 IS NOT NULL and LENGTH(m1.m_char_2)>0
于 2013-01-02T15:21:00.333 に答える
1

楽しみのために、私はそれが参加する必要はないと思います:

UPDATE meta_data AS mn
  SET m_char_2 = (
    SELECT m_char_2
    FROM (SELECT * FROM meta_data) AS md
    WHERE md.stage ='Reception' AND md.function='Notes'
      AND md.id = mn.id
    ) 
  WHERE project=519 AND stage='Reception'
    AND function ='Diagnosis_1' AND isnull(m_char_2)
于 2013-01-02T15:46:57.117 に答える