3

我有一些桌子:

会话
SessionID int PK
Created datetime
SiteId int FK

Tracking_Parameters
ParamID int PK
ParamName nvarchar

Session_Custom_Tracking
SessionID int FK
ParamID int FK
ParamValue nvarchar

Site_Custom_Parameters
SiteID int FK
ParamID int FK
ParamKey nvarchar

会话:包含访问者的唯一会话 ID 以及他们进入站点的时间。

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

Site_Custom_Parameters:对于特定站点(表未显示),声明 Tracking_Parameter 的键值(即在查询字符串或路由中查找的键)

Session_Custom_Tracking:会话和跟踪参数之间的链接,还包含我的应用程序找到参数键时的值。

问题:

我想为这些特定会话选择会话 ID,在 Session_Custom_Tracking 中有两个不同 ParamID 的记录。我想查找用户同时打开电子邮件(参数 1)并单击(参数 3)该电子邮件中的链接的会话。

4

1 回答 1

2

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

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

一个可能更容易阅读的替代方法(因为它更接近您描述问题的方式)是使用WHERE EXISTS

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
)
于 2012-08-23T16:50:51.417 回答