كيفية القيام بانضمام خارجي كامل دون توفر انضمام خارجي كامل

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

  •  21-09-2019
  •  | 
  •  

سؤال

في الأسبوع الماضي ، فوجئت عندما اكتشفت أن Sybase 12 لا يدعم الوصلات الخارجية الكاملة. لكن حدث لي أن الانضمام الخارجي الكامل يجب أن يكون هو نفس الاتحاد الخارجي الأيسر الذي تم نقله مع انضمام خارجي يمين لنفس SQL. هل يمكن لأي شخص أن يفكر في سبب هذا لن يكون صحيحًا؟

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

المحلول

UNION-ing اثنين OUTER JOIN يجب أن تؤدي البيانات إلى صفوف مكررة تمثل البيانات التي ستحصل عليها من INNER JOIN. يجب أن تفعل على الأرجح SELECT DISTINCT على مجموعة البيانات التي تنتجها UNION. بشكل عام إذا كان عليك استخدام أ SELECT DISTINCT هذا يعني أنه ليس استعلامًا مصممًا جيدًا (أو هكذا سمعت).

نصائح أخرى

إذا قمت بتوصيلهم مع UNION ALL, ، ستحصل على التكرارات. إذا كنت تستخدم للتو UNION بدون ال ALL, ، سوف يقوم بتصفية التكرارات وبالتالي يكون مكافئًا للانضمام الكامل ، لكن الاستعلام سيكون أيضًا أكثر تكلفة لأنه يجب أن يؤدي نوعًا متميزًا.

UNION ALL انضم اليسار إلى الانضمام الأيمن ، ولكن الحد من الصلة اليمنى إلى الصفوف فقط غير الموجودة في الجدول الأساسي (إرجاع فارغة عند الانضمام عندما لا تكون فارغة في الجدول إذا كانت موجودة).

لهذا الرمز ، ستحتاج إلى إنشاء جدولين T1 و T2. يجب أن يحتوي T1 على عمود واحد يسمى C1 مع خمسة صفوف تحتوي على القيم 1-5. يجب أن يكون T2 أيضًا عمود C1 مع خمسة صفوف تحتوي على القيم 2-6.

الانضمام الخارجي الكامل:

select * from t1 full outer join t2 on t1.c1=t2.c1 order by 1, 2;

ما يعادل الانضمام الخارجي الكامل:

select t1.c1, t2.c1 from t1 left join  t2 on t1.c1=t2.c1
union all
select t1.c1, t2.c1 from t1 right join t2 on t1.c1=t2.c1 
where t1.c1 is null
order by 1, 2;

لاحظ أن الفقرة على المكان الموجود على اليمين المرتبط بحد النتائج على تلك التي لن تتكرر فقط.

  1. حسنًا ، أولاً ، لا أعرف لماذا تستخدم 12.x. كان endoflifed في 31 ديسمبر 2009 ، بعد إخطاره في 3 أبريل 2007. تم تقديم 15.0.2 (الإصدار الصلب الأول) في يناير 2009. 15.5 أفضل بكثير وكان متاحًا في 02 ديسمبر 2009 ، لذلك أنت اثنين من الإصدارات الرئيسية ، وأكثر على الأقل على الأقل. 13 شهرًا ، قديمًا.

  2. ASE 12.5.4 لديه بناء جملة Join New. (لم تحدد ، قد تكون على 12.5.0.3 ، الإصدار قبل ذلك).

  3. لم ينفذ DB2 و Sybase FULL OUTER JOIN, ، لسبب بالضبط السبب الذي حددته: إنه مغطى بـ LEFT ... UNION ... RIGHT بدون ALL. إنها ليست حالة من "عدم دعم" FOJ ؛ إنها حالة الكلمة الرئيسية مفقودة.

  4. وبعد ذلك ، لديك المشكلة التي لن تستخدمها أنواع Sybase و DB2 عمومًا أيها الوصلات الخارجية ناهيك عن FOJs ، لأن قواعد البيانات الخاصة بهم تميل إلى أن تكون أكثر تطبيعًا ، وما إلى ذلك.

  5. أخيرًا ، هناك SQL عادي تمامًا يمكنك استخدامه في أي إصدار من Sybase الذي سيوفر وظيفة FOJ ، وسيكون أسرع بشكل واضح على 12.x ؛ أسرع بشكل هامشي فقط على 15.x. إنه نوع من وظيفة Rank (): غير ضروري تمامًا إذا كنت تستطيع كتابة مسمة فرعية.

  6. السبب الثاني لا يحتاج FULL OUTER, ، كما تفعل بعض المحركات المنخفضة ، لأن المحسن الجديد سريع للغاية ، ويتم تطبيع الاستعلام بالكامل. بمعنى آخر. ينفذ اليسار واليمين في تمريرة واحدة.

  7. اعتمادًا على عدم التطابق بين Sargs و DataType ، إلخ ، قد لا يزال يتعين على الفرز ، ولكن هذا أيضًا يتم بثه على جميع المستويات الثلاثة: النظام الفرعي للقرص I/O ؛ المحرك (المحرك) ؛ ومعالج الشبكة. إذا تم تقسيم الجداول الخاصة بك ، فسيتم موازية بالإضافة إلى ذلك في هذا المستوى.

  8. إذا لم يتم تكوين الخادم الخاص بك و مجموعة النتائج الخاصة بك كبيرة جدًا ، قد تحتاج إلى الزيادة proc cache size و number of sort buffers. هذا كل شئ.

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