2012-08-23 127 views
3

我有一些表:選擇從多對多表查詢

會議
的SessionID INT PK
創建日期時間
SITEID INT FK

Tracking_Parameters
- 芳族聚酰胺 INT PK
PARAMNAME nvarchar的

Session_Custom_Tracking
的SessionID INT FK
- 芳族聚酰胺 INT FK
ParamValue nvarchar的

Site_Custom_Parameters
SITEID INT FK
芳族聚酰胺 INT FK
ParamKey爲nvarchar

會議:包含一個訪問者,他們進入現場時唯一的會話ID。

Tracking_Parameters:包含的東西,你可能要跟蹤網站清單(即打開電子郵件,郵件點擊,看條等)

Site_Custom_Parameters:對於一個特定的網站(表未畫出),宣告了Tracking_Parameter鍵值(即關鍵在查詢字符串或路由)

Session_Custom_Tracking尋找:會話和跟蹤參數,也之間的鏈接包含了參數的值當它被發現時,鑰匙由我的申請。

問:

我想選擇會話ID的其中對於這些特定會話,有兩種不同的芳族聚酰胺的在Session_Custom_Tracking的記錄。我想查找用戶既打開了電子郵件(參數1),又點擊(參數3)該電子郵件中的鏈接的會話。

回答

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 

,可能是更容易閱讀(因爲你描述的問題的方式更加緊密地匹配)的alteranative是使用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 
)