从多个表查询中选择

时间:2012-08-23 16:47:45

标签: sql database database-design

我有一些表格:

会话
SessionID int PK
创建日期时间
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)该电子邮件中的链接的会话。

1 个答案:

答案 0 :(得分: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
)