Возвращает записи из главной таблицы, имеющие определенные записи в подробной таблице.

у меня есть следующие две таблицы случаев. 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'

этот запрос правильно возвращает Питера и Мэтта. Но мне нужны запросы по трем вопросам. во-первых. чтобы дать мне сотрудников без записи WIFE в tbl_family. то есть выход должен быть

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

во-вторых, записи с двумя записями WIFE (или любыми другими отношениями) для набора данных, которые это даст.

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

и, наконец, все те сотрудники, у которых есть записи ЖЕНА и МАТЬ. Этот запрос вернет

 -----------------------------------------
   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