كيف يمكنني الاستعلام عن المفاتيح الخارجية التي لا تتطابق مع القيود الخاصة بهم؟

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

سؤال

وSQL خادم عام 2005.

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

والإعداد:
جدولين، TableUser وTableOrder. TableUser ديه مفتاح أساسي "معرف المستخدم"، وTableOrder ديه مفتاح الخارجية "معرف المستخدم".

وكيف يمكنني العثور على الصفوف حيث يوجد TableOrder.UserID أي إدخال مطابق في TableUser.UserID؟

وعلى سبيل المثال، TableOrder.UserID لديها قيمة 250، ولكن لا يوجد مفتاح TableUser.UserID مطابقة 250.

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

المحلول

إليك طريقة واحدة:

select * from TableOrder where UserID not in (select UserID from TableUser);

وهناك العديد من الطرق المختلفة لكتابة هذا النوع من الاستعلام.

نصائح أخرى

والنهج المشترك الآخر هو اليسار صلة خارجية:

SELECT * FROM TableOrder o
LEFT OUTER JOIN TableUser u ON o.UserID = u.UserID
WHERE u.UserID is NULL

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

وكانت هناك قيود FK في الجداول لتبدأ. واستخدمت مثل FK وPK لكن ليس مشفرة - كان الاعتقاد بأنهم الحمل غير الضرورية. لذلك لدينا كافة الأعمدة، ولكن القيود لا مشفرة. عندما ذهبت لوضعهم في ذلك أنها ستنفذ، اكتشفت أن هناك الكثير من الانتهاكات.

وسؤالك يسلط الضوء على المشكلة. وهم فوق لا لزوم لها، ومنع الناس من asshattery قاعدة بيانات عامة.

وكل من جريج والأجوبة براد ساعدتني.

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