SQL - تحديث الجدول تغيير عمود واحد قيمة استنادا إلى جدول آخر
-
10-07-2019 - |
سؤال
آسف إذا كان العنوان ليست وصفية كما ينبغي أن يكون ولكن هو نوع من الصعب أن أشرح في جملة واحدة ما أحاول القيام به.).
لدي طاولة واحدة الروابط الكائنات الأصل مع كل منها الطفل.ولدي جدول آخر مع جميع الكائنات (الوالدين و الطفل) مع 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 إنه فقط أحد الوالدين).فائدة:أنت لا تحتاج إلى جدول إضافي و يمكن بسهولة إنشاء التسلسل الهرمي إذا لزم الأمر.
و الصورة, أعتقد أنك تريد عرض هذه في مكان ما في التعليمات البرمجية الخاصة بك ، ولكن ينبغي أن يكون من الأسهل مجرد تعديل حدد على الصورة-عنوان الأم ليست صورة وتعطى للطفل.فائدة:لا تحتاج إلى تحديث الجدول عندما تحصل على إدخالات جديدة و سيكون من الممكن أيضا أن بعض الأطفال الإدخالات الخاصة بهم صورة (إذا لزم الأمر).
تحرير:فقط لاحظت تعليق جديد عن مشروع مفتوح المصدر الجزء, بالطبع هذا يجعل من الصعب تغيير تصميم قاعدة البيانات.ولكن ربما لا يزال أسهل من نقل بعض المشاكل إلى جانب البرمجة (ما لم يتم التعامل معها من قبل البرمجيات مفتوحة المصدر كذلك).