سؤال نظرية الاستعلام SQL - بيان واحد مقابل استعلامات متعددة البيان

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

سؤال

عندما أكتب استفسارات SQL، أجد نفسي كثيرا ما أفكر في أن "لا توجد طريقة للقيام بذلك باستخدام استعلام واحد". عندما يحدث ذلك، أذهب في كثير من الأحيان إلى الإجراءات المخزنة أو وظائف ذات قيمة متعددة البيانات التي تستخدم جداول TEMP (من نوع واحد أو آخر) وينتهي بكوى الجمع ببساطة عن النتائج وإرجاع جدول النتائج.

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

أعتقد أن بعض المعلمات في النظام - أفكر في قاعدة بيانات علائقية (مثل MS SQL) مع الجداول التي تتبع أفضل الممارسات الشائعة (مثل جميع الجداول لها مفتاح أساسي وما إلى ذلك).

ملاحظة: من أجل الفوز "الإجابة المقبولة" على هذا، ستحتاج إلى توفير دليل نهائي (إشارة إلى مواد الويب أو شيء مماثل.)

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

المحلول

على الأقل مع الإصدار الأخير من Oracle ممكن تماما. يحتوي على "جملة نموذجية" مما يجعل SQL Turing كاملة. في http://blog.schauderhaft.de/2009/06/18/building-A-Turing-engine-an-oracle-sql-using-the-model-cluse/ ). بالطبع هذا كل شيء مع الحد المعتاد الذي لا يكون لدينا حقا وقتا غير محدود والذاكرة.

لهجة SQL العادية دون هذه البطن، لا أعتقد أنه من الممكن.

مهمة لا أستطيع أن أرى كيفية التنفيذ في "SQL العادي" ستكون: افترض طاولة مع عمود واحد من نوع صحيح

بالنسبة لكل صف "خلق القيمة" في الصف الحالي، وانتقل إلى أن العديد من الصفوف مرة أخرى، جلب هذه القيمة، فانتقل إلى أن العديد من الصفوف مرة أخرى، وتستمر حتى يتم إحضار نفس القيمة مرتين على التوالي وإرجاع ذلك نتيجة لذلك.

نصائح أخرى

اؤمن انه ممكن. لقد عملت مع استفسارات صعبة للغاية، واستفسارات طويلة جدا، وغالبا ما، فمن الممكن القيام بذلك باستخدام استعلام واحد. ولكن معظم الوقت، من الصعب السريعة، لذلك إذا قمت بذلك مع استفسار واحد، تأكد من أنك تعلق استفسارك بعناية.

لم أواجه مطلقا شيئا لا يمكن القيام به في استفسار واحد.
ولكن في بعض الأحيان يكون من الأفضل القيام بذلك في أكثر من استفسار واحد.

لا أستطيع إثبات ذلك، لكنني أعتقد أن الجواب هو نعم بحذر - شريطة أن يتم تصميم قاعدة البيانات الخاصة بك بشكل صحيح. عادة ما يتم إجبارك على كتابة عبارات متعددة للحصول على نتيجة معينة هي علامة على أن مخططك قد يحتاج إلى بعض التحسينات.

أود أن أقول "نعم" ولكن لا يمكن إثبات ذلك. ومع ذلك، عملية التفكير الرئيسية:

  • يجب أن يكون أي اختيار عملية تستند إليها

  • افتراضك هو أنك تتعامل مع مجموعات صحيحة رياضيا (أي تطبيع بشكل صحيح)

  • تحدد النظرية يجب أن تضمن أنها ممكنة

أفكار أخرى:

  • غالبا ما يتم تحميل عبارة SELECT متعددة جداول TEMP / متغيرات الجدول. هذه يمكن اشتقاقها أو فصلها في CTES.

  • يتم الآن معالجة أي معالجة RBAR (للخير أو السيئ) الآن مع التقليب / الخارجي تنطبق على الجداول المشتقة

  • سيتم تصنيف UDFS ك "الغش" في هذا السياق أشعر، لأنه يسمح لك بوضع مختارة في وحدة نمطية أخرى بدلا من واحد في واحد

  • لا يكتب مسموح به في تسلسل "قبل" الخاص بك DML: هذه التغييرات الحالة من تحديد لتحديد

  • هل رأيت بعض الكود في متجرنا؟

تحرير، مسرد

تحرير: تطبيق: الغش؟

SELECT
    *
FROM
    MyTable1 t1
    CROSS APPLY
    (
        SELECT * FROM MyTable2 t2
        WHERE t1.something = t2.something
    ) t2

من الناحية النظرية نعم، إذا كنت تستخدم وظائف أو متاهة تعذيبية من الطبقة الخارجية أو الاستفسارات الفرعية؛ ومع ذلك، للحصول على قابلية القراءة والأداء، فقد انتهى بنا دائما الذهاب مع طاولات TEMP والإجراءات المخزنة متعددة البيان.

كما علق شخص ما أعلاه، هذا هو عادة علامة على أن هيكل البيانات الخاص بك بدأ في الرائحة؛ ليس هذا هو سيئ, ، ولكن ربما حان الوقت للكشف عن أسباب الأداء (يحدث لأفضل منا)، أو ربما وضع طبقة استئصال غير معلمة أمام بيانات "الحقيقية الحقيقية" الطبيعية.

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