Bir nechta jadvalga oddiy qo'shilishni qanday bajaraman?

Bu erda men juda ishonchli bo'lgan savolga ega ekanligimga ishonchim bor, lekin hayotim uchun bu sodda qo'shilishni ishga sololmayman.

Asosan, 3 ta jadval bor:

  • MEMBERS (birinchi_yana, oxirgi_yana),
  • MEMBER_TO_GROUP (member_id, group_id)
  • to'lovlar (member_id, sana, miqdor).

Men ma'lum bir guruh a'zolaridan barcha to'lovlarni olishni qidiraman. Faqat ikkita jadvalni ishlatib, MEMBER ma'lumotisiz muayyan guruhning barcha to'lovlarini topa olaman yoki to'lov ma'lumotisiz barcha MEMBER ma'lumotlarini topa olaman. Ammo, men uchinchi jadvalni qo'shishga urinib ko'rganimda, noto'g'ri ma'lumotlar qaytariladi (masalan, men guruhga a'zo emasman). Men foydalanadigan asosiy so'rov:

SELECT
    p.*,
    m.first_name,
    m.last_name
FROM
    members m,
    payments p,
    member_to_group mg
WHERE
    mg.group_id = 12
    AND mg.member_id = p.member_id
    AND m.member_id = p.member_id

Ishonchim komilki, ajratish joyi qaerda, ammo har qanday yordam eng yuqori baholanadi.

2
Ansi qo'shilish sintaksisini ishlatish odatiga (masalan, galadorning javobida) kiring. O'qish osonroq va sizning mantiqiy xatolaringizni tez-tez ta'kidlaydi.
qo'shib qo'ydi muallif Nick Chammas, manba
@Nick, bu SQL89. Aniq JOIN SQL92 ... :-)
qo'shib qo'ydi muallif gbn, manba
Bu erda ishlatiladiganlar kabi yopiq qo'shimchalar SQL antipattern. Ushbu yomon sintaksikani 1992 yilda o'qish va saqlashni osonlashtirgan va tasodifiy o'zaro bog'liqliklarga ega bo'lish ehtimoli juda kam bo'lgan narsa bilan almashtirildi.
qo'shib qo'ydi muallif HLGEM, manba

1 javoblar

Menimcha, bu siz xohlagan narsani olishi kerak:

SELECT p.*,
       m.first_name,
       m.last_name
FROM payments p
INNER JOIN members m
  ON m.member_id = p.member_id
INNER JOIN member_to_group mg
  ON mg.member_id = m.member_id
WHERE mg.group_id = 12
2
qo'shib qo'ydi