Sql 从多对多表查询中选择

Sql 从多对多表查询中选择,sql,database,database-design,Sql,Database,Database Design,我有一些桌子: 会话 SessionID int PK 已创建日期时间 SiteId int FK 跟踪参数 ParamID int PK ParamName nvarchar 会话\自定义\跟踪 SessionID int FK ParamID int FK 参数值nvarchar 站点\自定义\参数 SiteID int FK ParamID int FK ParamKey nvarchar 会话:包含访问者的唯一会话id及其进入站点的时间 跟踪参数:包含您可能希望在网站上跟踪的内容列表(即

我有一些桌子:

会话
SessionID int PK
已创建日期时间
SiteId int FK

跟踪参数
ParamID int PK
ParamName nvarchar

会话\自定义\跟踪
SessionID int FK
ParamID int FK
参数值nvarchar

站点\自定义\参数
SiteID int FK
ParamID int FK
ParamKey nvarchar

会话:包含访问者的唯一会话id及其进入站点的时间

跟踪参数:包含您可能希望在网站上跟踪的内容列表(即打开电子邮件、单击电子邮件、查看文章等)

站点\自定义\参数:对于特定站点(未显示表),声明跟踪\参数的键值(即查询字符串或路由中要查找的键值)

会话\自定义\跟踪:会话和跟踪参数之间的链接,还包含应用程序找到该参数时的参数键值

问题:


我想选择session id,其中对于这些特定会话,session_Custom_跟踪中有两个不同参数id的记录。我想查找用户同时打开电子邮件(paramid 1)并单击该电子邮件中的链接(paramid 3)的会话。

您可以两次加入同一个表:

SELECT S.SessionID
FROM Sessions AS S
JOIN Session_Custom_Tracking AS SCT1
ON SCT1.SessionID = S.SessionID
AND SCT1.ParamID = 1
JOIN Session_Custom_Tracking AS SCT2
ON SCT2.SessionID = S.SessionID
AND SCT2.ParamID = 3
另一种可能更容易阅读的方法(因为它更符合您描述问题的方式)是在存在的地方使用

SELECT S.SessionID
FROM Sessions AS S
WHERE EXISTS
(
    SELECT *
    FROM Session_Custom_Tracking AS SCT1
    WHERE SCT1.SessionID = S.SessionID
    AND SCT1.ParamID = 1
)
AND EXISTS
(
    SELECT *
    FROM Session_Custom_Tracking AS SCT2
    WHERE SCT2.SessionID = S.SessionID
    AND SCT2.ParamID = 3
)