2012-02-11 14 views
0

これらの2つのテーブルの間にリンクがなく、私は結合しようとしています。表1は、有効期限と有効期限がPollDateの表2に紐付く必要があります。 PollDateは、有効期限と有効期限の間にあってはなりません。2つの異なるテーブルから有効期限と有効期限の間の日付を取得するSQLクエリ

Table 1 
ClientID EffectiveDate  ExpirationDate 
1  2009-04-01 00:00:00.000 2009-12-18 00:00:00.000 
1  2010-02-12 00:00:00.000 2010-03-05 00:00:00.000 
1  2010-05-18 00:00:00.000 NULL 
1  2009-12-21 00:00:00.000 2010-02-08 00:00:00.000 
1  2010-12-19 00:00:00.000 2009-12-20 00:00:00.000 

Table 2 
ClientID PollDate 
1  2009-12-20 00:00:00.000 
1  2009-12-19 00:00:00.000 
1  2010-02-12 00:00:00.000 
1  2010-02-27 00:00:00.000 
1  2010-05-19 00:00:00.000 
1  2010-05-29 00:00:00.000 
1  2010-05-30 00:00:00.000 
1  2010-05-31 00:00:00.000 
1  2010-06-05 00:00:00.000 
1  2010-06-25 00:00:00.000 
1  2010-06-27 00:00:00.000 
1  2010-07-02 00:00:00.000 
1  2010-08-04 00:00:00.000 
1  2010-08-20 00:00:00.000 

Result 
ClientID inValidDate 
1  2009-12-20 00:00:00.000 
1  2009-12-19 00:00:00.000  
+0

「混乱している彼らの間にリンクがあります "彼らは同じデータベースにいませんか?あなたは何らかのRPCオプションを探していますか? –

+0

いいえ。同じデータベースにあります。私がリンクで意味したことは、両方のテーブルがお互いの参照を持っていないということです。つまり、外部キーです。両方のテーブルの共通の支配はclientIDです。 – n00bs

答えて

0

にマッチします以下は、わずかな変化であります@ AJPの結果の - ちょうどNULL値を考慮してExpirationDate

CREATE TABLE #Table1 
(
    [ClientID] INT, 
    [EffectiveDate] DATETIME, 
    [ExpirationDate] DATETIME 
) 

INSERT INTO #Table1 
(
    [ClientID], 
    [EffectiveDate], 
    [ExpirationDate] 
) 
SELECT 1, '2009-04-01', '2009-12-18' UNION 
SELECT 1, '2010-02-12', '2010-03-05' UNION 
SELECT 1, '2010-05-18', NULL UNION 
SELECT 1, '2009-12-21', '2010-02-08' UNION 
SELECT 1, '2010-12-19', '2009-12-20' 

CREATE TABLE #Table2 
(
    [ClientID] INT, 
    [PollDate] DATETIME 
) 

INSERT INTO #Table2 
(
    [ClientID], 
    [PollDate] 
) 
SELECT 1, '2009-12-20' UNION 
SELECT 1, '2009-12-19' UNION 
SELECT 1, '2010-02-12' UNION 
SELECT 1, '2010-02-27' UNION 
SELECT 1, '2010-05-19' UNION 
SELECT 1, '2010-05-29' UNION 
SELECT 1, '2010-05-30' UNION 
SELECT 1, '2010-05-31' UNION 
SELECT 1, '2010-06-05' UNION 
SELECT 1, '2010-06-25' UNION 
SELECT 1, '2010-06-27' UNION 
SELECT 1, '2010-07-02' UNION 
SELECT 1, '2010-08-04' UNION 
SELECT 1, '2010-08-20' 

SELECT 
    t2.[ClientID], 
    t2.[PollDate] AS 'inValidDate' 
FROM 
    #Table1 AS t1 
JOIN 
    #Table2 AS t2 
ON 
    (t2.[PollDate] < t1.[EffectiveDate] 
OR t2.[PollDate] > ISNULL(t1.[ExpirationDate], '9999-12-31')) 
AND t1.ClientID = t2.ClientID -- Not clear from your question if this is necessary 
+0

'ExpirationDate'にすべての' NULL'値を含める場合は、 't2。[PollDate]> ISNULL(t1。[ExpirationDate]、 '1753- 01-01 ')) '代わりに – diaho

+0

ダイアゴーありがとう、これは何が必要です。有効期限内と有効期限内に一致するPollDateのすべてのリストが表示されます。追加する必要があるのは、両方がnullの場合です。したがって、両方の日付の間にないポーリング日付を除外します。 – n00bs

0

syntextについてはわからないが、このようなことをしたい。

select clientID, polDate as 'inValidDate' 
FROM Table1 t1 
INNER JOIN Table2 t2 
ON t2.PolDate not in between t1.EffectiveDate and t1.ExpirationDate 

EDIT:有効期限がnullの場合と仮定 は、ポリシーが期限切れにならないことを意味します。

select clientID, polDate as 'inValidDate' 
FROM Table1 t1 
INNER JOIN Table2 t2 
ON t2.PolDate not in between t1.EffectiveDate and ISNULL(t1.ExpirationDate, '2999-01-01') 
0

uは試すことができますuは結合条件に入れていなかったので

select t2.ClientID, t2.PoolDate 
from Table1 t1, Table2 t2 
where t2.PollDate between t1.EffectiveDate and t1.ExpirationDate 

を、TABLE1の各行は、表2の各行に

+0

私は彼が "有効期限と有効期限の間に投票所があってはならない"と言ったと思った。あなたのクエリは間になるでしょうか? – AJP

+0

質問のサンプル結果に「無効な日付」が表示されています – vicker313

関連する問題