Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql查询以解决以下场景_Sql_Database - Fatal编程技术网

Sql查询以解决以下场景

Sql查询以解决以下场景,sql,database,Sql,Database,我有一张像这样的桌子: Employeeid personid reltnship status 111 125 owner active 111 252 prevown active 112 3 descsd active 我想编写一个查询,以获取与'owner'和'prevown'组合关系的员工的所有详细信息。您应该研究mysql查询结构以及查询的子句 以下是查询: select * from

我有一张像这样的桌子:

Employeeid personid reltnship status 
111        125        owner   active
111        252      prevown   active
112        3        descsd    active

我想编写一个查询,以获取与
'owner'
'prevown'

组合关系的员工的所有详细信息。您应该研究mysql查询结构以及查询的子句

以下是查询:

select * 
from tablename 
where reltnship = 'owner'
or reltnship = 'prevown'

使用
Self-JOIN

SELECT DISTINCT S.* 
FROM Tbl S JOIN tbl T ON S.Employeeid = T.Employeeid
where S.reltnship = 'owner' AND T.reltnship = 'prevown'

使用子查询返回满足以下条件的所有
employeeid
s:

select * from tablename
where employeeid in (
  select employeeid
  from tablename
  where reltnship in ('owner', 'prevown')
  group by employeeid
  having count(distinct reltnship) = 2
)
请参阅。
结果:


如果需要所有详细信息,则有一种方法使用
exists

select t.*
from t
where exists (select 1
              from t t2
              where t2.employeeid = t.employeeid and
                    t2.reltnship = 'owner'
             ) and
      exists (select 1
              from t t2
              where t2.employeeid = t.employeeid and
                    t2.reltnship = 'prevown'
             ) ;
这句话的措词是索引友好的。您需要的索引位于
(employeeid,reltnship)

如果您只希望员工符合此标准,我建议您:

select t.employeeid
from t
where reltnship in ('owner', 'prevown')
group by employeeid
having count(distinct reltnship) = 2;

请更详细地描述您的问题,并添加一个示例输出。在将问题发布到社区之前,也要尝试展示你的尝试。Stackoverflow不是免费的代码编写服务。欢迎使用S/O,但您的问题中缺少一些。您没有employee表或person表的上下文来获取相应的人名,为什么给定的employee ID会有两个不同的person ID值。请编辑问题并提供其他数据以获取姓名信息,或者您是否只想要(在本例中)员工ID=111的两行结果(通过合法查询,而不仅仅是员工ID)您完全错过了所询问的问题。业主和前业主的员工,如出售房屋、汽车等。。。所有权链。当事人是谁。
select t.employeeid
from t
where reltnship in ('owner', 'prevown')
group by employeeid
having count(distinct reltnship) = 2;