it-swarm.dev

الطريقة الصحيحة للاختيار من بين جدولين في SQL Server مع عدم وجود حقل مشترك للانضمام إليه

مرة أخرى في الأيام الخوالي ، اعتدت على كتابة عبارات مختارة مثل هذا:

SELECT 
table1.columnA, table2.columnA

FROM
table1, table2

WHERE
table1.columnA = 'Some value'

ومع ذلك قيل لي أن وجود أسماء جدول مفصولة بفواصل في جملة "FROM" غير متوافق مع ANSI92. يجب أن يكون هناك دائمًا بيان JOIN.

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

أحد يعرف ماذا يفعل في هذه الحالة؟

معلومات اضافية:

يحتوي الجدول 1 على قائمة بالمواقع في نوع بيانات "الجغرافيا" ويحتوي الجدول 2 على قائمة مختلفة بمواقع "الجغرافيا"

أنا أكتب عبارة حدد لمقارنة المسافات بين المواقع. بقدر ما أعرف أنك غير قادر على الانضمام إلى عمود جغرافي؟

28
volume one

يمكنك (يجب) استخدام CROSS JOIN. الاستعلام التالي سيكون معادلاً لك:

SELECT 
   table1.columnA
 , table2.columnA
FROM table1 
CROSS JOIN table2
WHERE table1.columnA = 'Some value'

أو يمكنك حتى استخدام INNER JOIN مع بعض conditon الحقيقي دائمًا:

FROM table1 
INNER JOIN table2 ON 1=1
50
Nenad Zivkovic

اقتراح - عند استخدام cross cross ، يرجى الانتباه إلى السيناريوهات المكررة. على سبيل المثال في قضيتك:

  • قد يحتوي الجدول 1 على> عمود واحد كجزء من المفاتيح الأساسية (على سبيل المثال ، table1_id ، id2 ، id3 ، table2_id)
  • قد يحتوي الجدول 2 على> عمود واحد كجزء من المفاتيح الأساسية (مثل table2_id و id3 و id4)

نظرًا لوجود مفاتيح مشتركة بين هذين الجدولين (أي المفاتيح الخارجية في أحد/الآخر) - سننتهي بنتائج مكررة. وبالتالي استخدام النموذج التالي جيد:

WITH data_mined_table (col1, col2, col3, etc....) AS
SELECT DISTINCT col1, col2, col3, blabla
FROM table_1 (NOLOCK), table_2(NOLOCK))
SELECT * from data_mined WHERE data_mined_table.col1 = :my_param_value
1
ha9u63ar

سيساعد التقاطع التبادلي على الانضمام إلى جداول متعددة دون وجود حقول مشتركة. ولكن كن حذرًا أثناء الانضمام لأن هذا الرابط سيعطي نتائج ديكارت من جدولين. QUERY:

SELECT 
   table1.columnA
 , table2,columnA
FROM table1 
CROSS JOIN table2

طريقة بديلة للانضمام في بعض الحالات التي هي دائما مثل صحيح

SELECT 
   table1.columnA
 , table2,columnA
FROM table1 
INNER JOIN table2 ON 1=1

ولكن يجب تجنب هذا النوع من الاستعلامات من أجل الأداء وكذلك معايير الترميز.

1
vinay koul