اختلاف متماثل محليًا في SQL
-
01-10-2019 - |
سؤال
لدي مشكلة مماثلة ل هذا السؤال 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