SQL - تحديث الجدول تغيير عمود واحد قيمة استنادا إلى جدول آخر

StackOverflow https://stackoverflow.com/questions/1819295

سؤال

آسف إذا كان العنوان ليست وصفية كما ينبغي أن يكون ولكن هو نوع من الصعب أن أشرح في جملة واحدة ما أحاول القيام به.).

لدي طاولة واحدة الروابط الكائنات الأصل مع كل منها الطفل.ولدي جدول آخر مع جميع الكائنات (الوالدين و الطفل) مع respectives الصور.ومع ذلك ، فإن الصورة هي مجرد مجموعة للوالدين الكائنات.أود أن التحديث الأخير هذا الجدول وتعيين تشايلدز صورة نفس الصورة التي تم تعيينها بالفعل عن الأم.بالإضافة إلى, كما أن هناك أكثر من صورة واحدة لكل كائن ، أود أن مجموعة واحدة على وجه الخصوص ، وهو ما يمكن أن تعرف على أساس سمة العمود.

الجداول تبدو شيئا مثل:

RelationTable

الطفل-id

الأم-id

ImageTable

كائن معرف

سمة معرف

صورة-url

و هنا يذهب على سبيل المثال من أجل توضيح الأمور:

RelationsTable

الطفل-الهوية | الأم-id

3 | 1

4 | 1

5 | 2

ImageTable

كائن معرف | سمة معرف | صورة-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.أنا لا أعرف إذا كان ينبغي لي أن استخدام متغير (لم تستخدم قط واحد) أو إذا كان هذا يمكن القيام به مع واحد فقط SQL الجملة.

أي مساعدة سيكون محل تقدير كبير.

هل كانت مفيدة؟

المحلول

شيء مثل هذا ؟

ملاحظات:

هذا يمكن دمجها في واحد غير الاستعلام الفرعي البيان ولكن كنت كسول.

لم الاختبار ، نتوقع الأخطاء المطبعية

;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, لماذا لا يمكنك فقط إضافة هذه المعلومات إلى نفس الطاولة ؟ على سبيل المثالfieldname "parentid" (إذا كان فارغا/null إنه فقط أحد الوالدين).فائدة:أنت لا تحتاج إلى جدول إضافي و يمكن بسهولة إنشاء التسلسل الهرمي إذا لزم الأمر.

و الصورة, أعتقد أنك تريد عرض هذه في مكان ما في التعليمات البرمجية الخاصة بك ، ولكن ينبغي أن يكون من الأسهل مجرد تعديل حدد على الصورة-عنوان الأم ليست صورة وتعطى للطفل.فائدة:لا تحتاج إلى تحديث الجدول عندما تحصل على إدخالات جديدة و سيكون من الممكن أيضا أن بعض الأطفال الإدخالات الخاصة بهم صورة (إذا لزم الأمر).

تحرير:فقط لاحظت تعليق جديد عن مشروع مفتوح المصدر الجزء, بالطبع هذا يجعل من الصعب تغيير تصميم قاعدة البيانات.ولكن ربما لا يزال أسهل من نقل بعض المشاكل إلى جانب البرمجة (ما لم يتم التعامل معها من قبل البرمجيات مفتوحة المصدر كذلك).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top