2011-04-21 12 views
0

2つの条件が満たされているIDのリストを結果リストで取得しようとしています: 1)IDに指定時間内にサービス(参照またはメモで決定)があります。 -6/30/2010 2)指定した時間ネストされたクエリで問題が発生しました

が、私はこの長いクエリを作ってみたが、それはまだ前のサービスを持っているものを持ち帰る前に、IDが現れていない。

SELECT DISTINCT c.id, 
       c.lastname, 
       c.firstname 
FROM roundtable rt 
     INNER JOIN clients c 
     ON c.id = rt.clientid 
     LEFT OUTER JOIN notes n 
     ON c.id = n.clientid 
     LEFT OUTER JOIN referral rf 
     ON c.id = rf.clientid 
WHERE (rf.referraldate>='2009-07-01' 
     AND rf.referraldate<='2010-06-30') 
     OR (n.createddate>='2009-07-01' 
      AND n.createddate<='2010-06-30') 
      AND c.id NOT IN (SELECT DISTINCT clt.id 
          FROM roundtable rtb 
            INNER JOIN clients clt 
            ON clt.id = rtb.clientid 
            LEFT OUTER JOIN notes nts 
            ON clt.id = nts.clientid 
            LEFT OUTER JOIN referral ref 
            ON clt.id = ref.clientid 
          WHERE (rf.referraldate < '2009-07-01') 
            OR (n.createddate < '2009-07-01')) 
ORDER BY c.lastname, 
      c.firstname 

たとえば、ID、ReferralDate、NoteCreatedDate
4、2/12/2008、3/12/2008
4、2009年7月15日、2009年7月30日
6、2008年5月30日、2007年2月26日
8、2009年7月20日、2008年3月20日
9、7 ID 4は以前の照会と期間外のメモを持ち、ID 6は照会とメモの両方を持っているので、ID 4,6,8は戻りリストに含まれてはいけません。期間外ではID8は期間外に1つの音符を有する。この場合、期間内に日付があり、以前のレコードがないため、ID 9が返されるのはID 9だけです。

ありがとう!

+0

あなたのお問い合わせでいくつかの書式を設定してください。 –

+1

DUMMYデータダンプをまったく送信できますか? –

答えて

1
SELECT DISTINCT 
      c.id 
     , c.lastname 
     , c.firstname 
FROM 
    roundtable rt 
    INNER JOIN 
      clients c 
        on c.id = rt.clientid 
    LEFT OUTER JOIN 
      notes n 
        on c.id = n.clientid 
    LEFT OUTER JOIN 
      referral rf 
        on c.id = rf.clientid 
WHERE 
     (rf.referraldate BETWEEN '2009-07-01' AND '2010-06-30' or n.createddate BETWEEN '2009-07-01' and '2010-06-30') 
AND 
     c.id not in (SELECT DISTINCT 
             clt.id 
        FROM 
         roundtable rtb 
         INNER JOIN 
            clients clt 
              on clt.id = rtb.clientid 
         LEFT OUTER JOIN 
            notes nts 
              on clt.id = nts.clientid 
         LEFT OUTER JOIN 
            referral ref 
              on clt.id = ref.clientid 
        WHERE 
          (rf.referraldate < '2009-07-01' or n.createddate <'2009-07-01')) 
ORDER BY 
     c.lastname, c.firstname 
+0

これは完全に機能し、私は床が詰まっています。どういうふうに日付を変えれば違いがあるのでしょうか?ありがとうsoooたくさん! – WixLove

+0

これは、OPのSQLとはどのように意味的に異なっていますか? –

+0

@WixLove。 'BETWEEN'を変更し、サブクエリの' WHERE'節でエイリアスを変更したのですか、それとも間違っていましたか?それ以外の場合はこれは私には意味がないので、私は不思議です。 –

0

データを引き戻さないため、参加する必要はありません。条件に一致するいずれかのテーブルにレコードが存在するかどうかを簡単に確認できます。 EXISTSキーワードは、一致が見つかると直ちに検索を停止するので、本当にいいです。

SET @begin_date = '2009-07-01'; 
SET @end_date = '2010-06-30'; 

SELECT 
    c.id, 
    c.lastname, 
    c.firstname 
FROM 
    clients c 
WHERE 
    EXISTS (
     SELECT 
      * 
     FROM 
      referrer r 
     WHERE 
      r.clientid = c.id 
     AND 
      r.referraldate >= @begin_date 
     AND 
      r.referraldate <= @end_date) 
OR 
    EXISTS (
     SELECT 
      * 
     FROM 
      notes n 
     WHERE 
      n.clientid = c.id 
     AND 
      n.createdate >= @begin_date 
     AND 
      n.createdate <= @end_date) 
ORDER BY 
    c.lastname, 
    c.firstname; 
+0

これは役に立つかもしれないと思います。ありがとうございました! – WixLove

0

それはコピーペースト・エラーのように見えます。あなたは、私はロビーが必要あなたに拾っての余分なセットとして、あなたはさらに

 WHERE (ref.referraldate < '2009-07-01') 
         OR (nts.createddate < '2009-07-01') 

を意味考えるときあなたは

 WHERE (rf.referraldate < '2009-07-01') 
         OR (n.createddate < '2009-07-01') 

を書いたWHERE

以外のサブクエリで異なる表の別名を使用しましたparens。あなたが括弧を入れ子にする必要がないので、彼のように間を使用すると簡単になります

WHERE 
(
    (rf.referraldate>='2009-07-01' 
     AND rf.referraldate<='2010-06-30') 
    OR (n.createddate>='2009-07-01' 
    AND n.createddate<='2010-06-30') 
) 
AND NOT IN (.... 
+0

ああうわー!ありがとう!その修正はしましたが、私はまだそこにはいけないIDを取得します。 – WixLove

+0

@WixLove Robbie Tappingが示唆するように、いくつかのダミーデータを提供する必要があります。質問の下にある編集リンクを押してそこに追加することで、それを行うことができます。 –

+0

Ok - 私はそれをやったと思います。ありがとう! – WixLove