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