2011-10-15 176 views
1

我有兩個表。他們用一個用戶名連在一起。我想要做的是檢查表2中是否有鏈接記錄,以及該表中的日期字段是否早於某個特定時間,或者如果第二個表中沒有鏈接記錄。sql:想要根據表2中的匹配(或不匹配)記錄從表1中選擇記錄

我以爲我想要一個左連接,但它忽略了日期字段。如果第二個表中沒有記錄,那麼我想忽略第二個表。但是,如果第二張表中有匹配的記錄,並且日期超出了我的範圍,那麼我不想選擇這些記錄。

SELECT FirstName, Email, u.userid FROM u 
LEFT JOIN uevh 
ON u.UserID = uevh.UserID AND uevh.LastEmailed < GETDATE()-14 
WHERE u.ConfirmedEmail = 0 

如果我運行,並有一個記錄在uevh表這是不到14天,我不想一個返回的記錄,但考慮日期它返回的記錄。

+0

取得的進展進行小點點 - 切換各地加盟,所以它在表1中加入表2 - 現在,當我選擇,當它不應該返回記錄時,它會返回一個記錄,但在字段中有空值。 – merk

+0

至少提供迄今爲止創建的SQL查詢。 – DeCaf

+0

對不起 - 我包括我正在使用的SQL查詢 – merk

回答

2
SELECT u.FirstName 
    , u.Email 
    , u.userid 
FROM u 
WHERE NOT EXISTS 
     (SELECT * 
      FROM uevh 
      WHERE u.UserID = uevh.UserID 
      AND NOT (uevh.LastEmailed < GETDATE()-14) 
     ) 
    AND u.ConfirmedEmail = 0 

或:

SELECT u.FirstName 
    , u.Email 
    , u.userid 
FROM u 
WHERE (EXISTS 
     (SELECT * 
      FROM uevh 
      WHERE u.UserID = uevh.UserID 
      AND uevh.LastEmailed < GETDATE()-14 
     ) 
    OR NOT EXISTS 
     (SELECT * 
      FROM uevh 
      WHERE u.UserID = uevh.UserID 
     ) 
    ) 
    AND u.ConfirmedEmail = 0 

或:

SELECT u.FirstName 
    , u.Email 
    , u.userid 
FROM u 
    LEFT JOIN uevh 
    ON u.UserID = uevh.UserID 
WHERE u.ConfirmedEmail = 0 
    AND (uevh.LastEmailed < GETDATE()-14 
    OR uehv.UserID IS NULL 
    ) 
+0

#3是我要發佈的內容。 –

+0

#3是我一起去的,謝謝你的回答,併爲我展示了多種方式。 – merk

+0

它們並不完全是多種方式,但也會產生稍微不同的結果。嘗試使用小數據集,以便看到差異。 –

1

你可以嘗試這樣的事情。這是未經測試,但應該工作。

Declare @date datetime; 
Set @date='20110101'; 

Select * 
from tbl1 
Left outer join tbl2 on tbl1.Id =tbl2.Id 
    and @date > coalesce(tbl2.date,dateadd(day,1,@date)); 
相關問題