ส่งกลับบันทึกจากตารางหลักที่มีบันทึกเฉพาะในตารางรายละเอียด

ฉันมีตารางกรณีสองกรณีต่อไปนี้ tbl_emp เป็นตารางหลัก พูดว่า:-

 ----------------------------------------------------------
   tbl_emp
 ----------------------------------------------------------
    emp_id            emp_name
     1                  Peter
     2                  Matt
     3                  Jacob
 ----------------------------------------------------------

และตารางรายละเอียดมีรายละเอียดครอบครัวพนักงาน.......

 -----------------------------------------------------------------
  tbl_family
 ----------------------------------------------------------------
   family_id         emp_id        relation       name       age
 -----------------------------------------------------------------
     1                 1            WIFE          Susan       32
     2                 1            SON           Jack        3
     3                 2            DAUGHTER      Hannah      4
     4                 2            WIFE          Leah        29
     5                 1            WIFE          Anna        38
     6                 3            MOTHER        Loran       73
     7                 2            MOTHER        Sofia       81
 ------------------------------------------------------------------

ฉันต้องการสอบถามเพื่อทราบว่าพนักงานทุกคนมีรายการ 'ความสัมพันธ์' เฉพาะใน tbl_family และใครไม่มี เช่น ฉันจัดการคำถามต่อไปนี้สำหรับพนักงานที่มีรายการ WIFE

 select * from tbl_emp, tbl_family where
 tbl_emp.emp_id = tbl_family.emp_id and
 tbl_family.relation = 'WIFE'

แบบสอบถามนี้ส่งคืน Peter และ Matt อย่างถูกต้อง แต่ฉันต้องการคำถามสำหรับสามประเด็น ประการแรก เพื่อให้พนักงานที่ไม่มี WIFE เข้าใน tbl_family ให้ฉัน นั่นคือเอาท์พุตควรจะเป็น

  ---------------------------------------
    emp_id        emp_name
  ---------------------------------------
      3            Jacob
  ---------------------------------------

ประการที่สอง บันทึกด้วยรายการ WIFE สองรายการ (หรือความสัมพันธ์อื่นใด) สำหรับชุดข้อมูลที่จะให้

 -----------------------------------------
   emp_id            emp_name
 -----------------------------------------
     1                Peter
 -----------------------------------------

และสุดท้าย พนักงานทุกคนที่มีรายการ WIFE และ MOTHER แบบสอบถามนี้จะกลับมา

 -----------------------------------------
   emp_id            emp_name
 -----------------------------------------
     2               Matt
 -----------------------------------------

ฉันได้แก้ไขคำถามพร้อมผลลัพธ์ทั้งหมดแล้ว ขอบคุณ.


person learner    schedule 16.07.2013    source แหล่งที่มา
comment
คุณสามารถให้ผลลัพธ์ตัวอย่างได้หรือไม่?   -  person Nithesh Narayanan    schedule 16.07.2013
comment
มีเอาต์พุตตัวอย่างเซอร์ให้ไว้   -  person learner    schedule 16.07.2013


คำตอบ (3)


จุดแรก:

 --wihout wife
 select tbl_emp.* 
 from tbl_emp  
 left join tbl_family 
 on 
   tbl_emp.emp_id = tbl_family.emp_id and tbl_family.relation = 'WIFE'
 where tbl_family.emp_id IS NULL;

จุดที่สอง:

 --having any relation at least twice
 select tbl_emp.id, tbl_emp.name, tbl_family.relation
 from tbl_emp  
 left join tbl_family 
 on 
   tbl_emp.emp_id = tbl_family.emp_id 
 group by tbl_emp.id, tbl_emp.name, tbl_family.relation
 having count(tbl_family.emp_id) > 1;

จุดที่สาม:

 --having WIFE, SON AND DAUGHTER.
 select tbl_emp.id, tbl_emp.name 
 from tbl_emp  
 left join tbl_family 
 on 
   tbl_emp.emp_id = tbl_family.emp_id and (
     tbl_family.relation = 'WIFE' or 
     tbl_family.relation = 'SON' or 
     tbl_family.relation = 'DAUGHTER'
     )
 group by tbl_emp.id, tbl_emp.name
 having count(distinct tbl_family.relation) >= 3;
person Florin Ghita    schedule 16.07.2013
comment
พี่ชาย. ขอบคุณสำหรับคำตอบที่ซับซ้อน ฉันอยากถามคำถามโง่ๆ เหมือนคุณเห็นคำถามแล้วจึงถามคำถามที่ถูกต้อง จะได้รับความเชี่ยวชาญระดับนี้ได้อย่างไร? นั่นเป็นเพราะการศึกษาหรือประสบการณ์อย่างถี่ถ้วนเท่านั้นเหรอ? เพราะฉันรู้ sql แต่ฉันไม่สามารถทำการสืบค้นเช่นนั้นได้ ขอบคุณ. - person learner; 17.07.2013
comment
ยินดีต้อนรับ :) คำถามเหล่านี้ไม่ใช่คำถามที่ซับซ้อน แต่คำตอบสำหรับคำถามของคุณคือ: ความหลงใหลและประสบการณ์ ใช่แล้ว อันดับแรกคือการศึกษา ตามด้วยประสบการณ์ จากนั้นจึงศึกษาและประสบการณ์อีกครั้ง Sql เป็นภาษาที่เรียบง่าย แต่เป็นกระบวนทัศน์ที่แตกต่างกัน (เป็นภาษาคิวรี ไม่ใช่ขั้นตอน) และอาจมีคำถามที่ซับซ้อน - person Florin Ghita; 17.07.2013
comment
ขอพระเจ้าอวยพรคุณ. ขอบคุณ. - person learner; 17.07.2013

จุดที่สาม:

SELECT tbl_emp.*
  FROM tbl_emp
   INNER JOIN tbl_family tf1
      ON tbl_emp.emp_id = tf1.emp_id AND tf1.relation = 'WIFE'
   INNER JOIN tbl_family tf2
      ON tbl_emp.emp_id = tf2.emp_id AND tf2.relation = 'MOTHER';
person Aidann    schedule 16.07.2013

คุณควรเล่นกับ tbl_family.relation = 'WIFE'

คุณสามารถใช้เช่น (tbl_family.relation = 'WIFE' OR tbl_family.relation = 'MOTHER' OR tbl_family.relation = 'DAUGHTER')

นอกจากนี้ คุณยังสามารถใช้ OUTER JOIN เพื่อค้นหาบุคคลที่ไม่มีสมาชิกในครอบครัวได้

person StanislavL    schedule 16.07.2013