سؤال

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

على سبيل المثال ، يحتوي الجدول A و B على أعمدة X و Y و Z وأريد مقارنة Y ، Z فقط للاختلافات ، لكنني ما زلت أريد تعيين النتيجة لتضمين X.

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

المحلول

SQL Old Style SQL للانضمام الكامل - A متسلسل مع B ، باستثناء الصفوف في B أيضا في (الوسط):

-- all rows in A with or without matching B
select a.x, a.y, a.z 
  from a
       left join b
         on a.x = b.x
        and a.y = b.y
union all
-- all rows in B with no match in A to "exclude the middle"
select b.x, b.y, null as z
  from b
 where not exists (select null
                     from a
                    where b.x = a.x
                      and b.y = a.y)

نمط أنسي:

select coalesce(a.x, b.x) as x,
       coalesce(a.y, b.y) as y,
       a.z
  from a 
       full outer join b
         on a.x = b.x
        and a.y = b.y

هناك COALESCE موجودة من أجل السلامة. لم يكن لدي أي سبب لكتابة انضمام خارجي كامل في العالم الحقيقي.

إذا كان ما تريد حقًا معرفة ما إذا كان جدولان متطابقان ، فإليك كيف:

SELECT COUNT(*) 
  FROM (SELECT list_of_columns
          FROM one_of_the_tables
         MINUS
        SELECT list_of_columns
          FROM the_other_table
        UNION ALL
        SELECT list_of_columns
          FROM the_other_table
         MINUS
        SELECT list_of_columns
          FROM one_of_the_tables)

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

نصائح أخرى

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

SELECT a.x, a.y, a.z, b.x, b.y, b.z
  FROM a FULL OUTER JOIN b ON a.y = b.y AND a.z = b.z
  WHERE a.y IS NULL OR b.y IS NULL
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top