有3个表格:事件,事件客户端和客户端。如何编写一个Sql查询来查找另一个表中的所有参与行?
编写一个查询,查找所有客户端都有权访问的事件?
内连接并不保证表中的所有行参加所以这并不能帮助:
select * from events e
inner join eventclients ec on e.id = ec.eventid
inner join clients c on etc.clientid = c.id
有3个表格:事件,事件客户端和客户端。如何编写一个Sql查询来查找另一个表中的所有参与行?
编写一个查询,查找所有客户端都有权访问的事件?
内连接并不保证表中的所有行参加所以这并不能帮助:
select * from events e
inner join eventclients ec on e.id = ec.eventid
inner join clients c on etc.clientid = c.id
您可以使用嵌套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
)
)
假设你的意思是事件有一个多对多的关系客户端和event_client是它们之间的桥接表,那么您应该提出关于跨多对多关系的SQL连接的许多其他问题。
你也可以做
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演示
这是一个非常可读的声明,谢谢 –
感谢,你能解释一下它做什么? –
@TheLight:它返回所有可用客户端在具有给定'eventid'的eventclient中的所有事件。由于双重否定,这有点令人困惑。注意:“NOT EXISTS”是有效的,并没有像其他方法那样的陷阱(可空列)。看看:http://www.sqlperformance.com/2012/12/t-sql-queries/left-anti-semi-join –