SQL-別のテーブルに基づいて1つの列の値を変更してテーブルを更新する
-
10-07-2019 - |
質問
タイトルの説明がそれほど正確ではないが、私がやろうとしていることを1つの文で説明するのが難しい場合は申し訳ありません。
親オブジェクトとそれぞれの子をリンクするテーブルが1つあります。そして、それぞれの画像を持つすべてのオブジェクト(親と子)を持つ別のテーブルがあります。ただし、画像は親オブジェクトに設定されているだけです。この最後のテーブルを更新し、その親に既に設定されている同じ画像を子画像に設定したいと思います。また、各オブジェクトには複数の画像があるため、特に1つを設定したいと思います。これは属性列に基づいて知ることができます。
私のテーブルは次のようになります:
RelationTable
child-id
parent-id
ImageTable
object-id
属性ID
image-url
そして、物事を明確にするための例を示します:
RelationsTable
child-id |親ID
3 | 1
4 | 1
5 | 2
ImageTable
object-id |属性ID | image-url
1 | goodimage | image1.jpg
1 | badimage | image1b.jpg
2 | goodimage | image2.jpg
2 | badimage | image2b.jpg
3 | goodimage |いいえ
3 | badimage |いいえ
4 | goodimage |いいえ
4 | badimage |いいえ
5 | goodimage |いいえ
5 | badimage |いいえ
したがって、オブジェクト3、4、5(子の画像)の画像をそれぞれの親画像に設定しますが、「正しい」画像、つまり「goodimage」を属性IDに設定した画像に設定します。
最後に次のようになります:
1 | goodimage | image1.jpg
1 | badimage | image1b.jpg
2 | goodimage | image2.jpg
2 | badimage | image2b.jpg
3 | goodimage | image1.jpg
3 | badimage |いいえ
4 | goodimage | image1.jpg
4 | badimage |いいえ
5 | goodimage | image2.jpg
5 | badimage |いいえ
実際には、「badimage」が設定されているかどうかは気にしませんが、重要なのは「goodimage」です。
次のようなことを試みました:
UPDATE ImageTable
SET image = (SELECT image-url FROM ImageTable WHERE ImageTable.object-id = RelationTable.parent-id AND ImageTable.attribute-id = 'goodimage')
WHERE ImageTable.object-id = RelationTable.child-id AND ImageTable.attribute-id = 'goodimage'
ただし、SQL構文が正しくないため機能しません。変数を使用する必要があるか(使用したことがない)、または1つのSQL文だけでこれを実行できるかどうかはわかりません。
ご協力いただければ幸いです。
解決
このようなものですか?
注:
これは1つにマージできます 非サブクエリステートメントですが、私は 怠け者。
テストしなかったが、タイプミスを期待する
;WITH goodlist AS
(
SELECT child-id, image-url
FROM relationstable
left join imagetable on relationstable.child-id = relationstable.child-id and attribute-id = "goodimage"
)
UPATE imagetable
set imagetable.image-url =
(SELECT top 1 image-url from goodlist where child-id = imagetable.object-id)
WHERE imagetable.image-url = "no"
他のヒント
まず、親と子の関係が1:nの場合、同じテーブルにその情報を追加してみませんか?例えばフィールド名" parentid" (空/ヌルの場合は親のみです)。利点:追加のテーブルは不要で、必要に応じて簡単に階層を作成できます。
画像については、コードのどこかに表示したいのですが、SELECTを変更して、子の画像が指定されていない場合、親の画像URLを取得する方が簡単です。利点:新しいエントリを取得するときにテーブルを更新する必要がなく、一部の子エントリに独自のイメージを含めることも可能です(必要な場合)。
edit:オープンソースプロジェクトの部分についての新しいコメントに気づいたばかりです。もちろん、これによりデータベースの設計を変更するのが難しくなります。ただし、問題の一部をプログラミング側に移す方が簡単かもしれません(これがオープンソースソフトウェアによっても処理されない限り)。