2013-07-16 45 views
0

我有以下两个案例表。 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_家庭中的特定“关系”条目以及不具有的人员。例如,我管理以下询问雇员有WIFE条目

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

此查询返回正确的彼得和马特。但我需要查询三个问题。首先。给我的员工在tbl_family没有WIFE入口。即出放应

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

seconldy,与数据集的两名妻子的条目(或任何其他关系)记录它会给

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

,最后,所有那些谁的妻子和母亲的员工条目。此查询将返回

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

我编辑了所有结果输出的问题。谢谢。

+0

你能提供一个示例输出吗? – Nithesh

+0

提供爵士示例输出。 – learner

回答

1

第一点:

--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; 
+0

Bro。感谢您的精心解答。我想问一个愚蠢的问题。就像你看到了这个问题,并用正确的查询。如何获得这种专业水平?仅仅是因为彻底的学习或经验?因为我知道SQL,但我不能做这样的查询。谢谢。 – learner

+0

欢迎您:)这些并不是复杂的问题,但您的问题的答案是:激情和经验。是的,首先是学习,然后是经验。当时的研究和再次的经验。 Sql是一种简单的语言,但是是一种不同的范式(它是一种查询语言,而不是程序)。并且可能有复杂的查询。 –

+0

上帝保佑你。谢谢。 – learner

0

你应该tbl_family.relation = 'WIFE'

玩可以使用例如(tbl_family.relation = 'WIFE' OR tbl_family.relation = 'MOTHER' OR tbl_family.relation = 'DAUGHTER'

您也可以使用OUTER JOIN找到人没有家庭成员

1

第三点:

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'; 
相关问题