如何编写Sql查询以查找另一个表中的所有参与行?

时间:2013-10-28 09:04:51

标签: sql tsql join relational-division

有3个表:events,eventClients和clients。

编写一个查询,查找所有客户都有权访问的事件?

内部联接并不保证表中的所有行都参与,因此这没有帮助:

select * from events e
inner join eventclients ec on e.id = ec.eventid
inner join clients c on etc.clientid = c.id

3 个答案:

答案 0 :(得分:3)

您可以使用嵌套NOT EXISTS来检查:

SELECT e.* 
FROM   events e 
WHERE NOT EXISTS(
    SELECT 1 FROM  client c 
    WHERE NOT EXISTS(
        SELECT 1 FROM eventclients ec 
        WHERE ec.eventid = e.id AND c.id= ec.clientid 
    )
)

Demo

答案 1 :(得分:1)

您也可以

SELECT e.id, e.name
  FROM events e LEFT JOIN eventclients ec
    ON e.id = ec.eventid LEFT JOIN clients c
    ON ec.clientid = c.id
 GROUP BY e.id, e.name
HAVING COUNT(ec.clientid) = 
(
  SELECT COUNT(*) FROM clients
)

这是 SQLFiddle 演示

答案 2 :(得分:0)

假设您的意思是事件客户端有多对多的关系, event_client 是它们之间的桥接表,那么你是否有任何其他问题要求跨多对多关系进行SQL连接。

SQL many to many select

How to filter SQL results in a has-many-through relation