2017-01-05 8 views
1

私はいくつかのテーブルから情報を取り出そうとしていますが、人が複数のエントリ、すなわち複数の情報行を持っている場合にのみ行を表示したいと考えています特定のフィールドが複数の行にしか現れない行を選択

これはそのままのコードです。私は様々な方法を使ってHAVING count(person)> 1を使用していますが、それを正しく得ることはできません。

すべてのご協力をよろしくお願いいたします。

SELECT DISTINCT 
      table1.person 
     , table1.id 
     , table1.type 
     , table1.active 
     , table2.stage 
     , table3.start 
     , table3.end 

FROM 
      people table1 
     , storyType table2 
     , storyContract table3 

WHERE 
     table1.type = table2.type_id 
    AND table2.stage = 1 
    AND table1.id = table3.contract_id 
    AND table3.start > '2015-01-01 00:00:00' 

現在の結果は

person   id  start    end     type active stage 

Keith Richards 202971 24/11/2015 00:00 07/03/2016 00:00 8  1  Amber 
Keith Richards 218325 07/03/2016 00:00 07/04/2016 00:00 10  1  Red 
Steve Perryman 217788 02/03/2016 00:00 04/07/2016 00:00 8  1  Amber 
Cyril Knowles 202438 20/11/2015 00:00 24/06/2016 00:00 10  1  Red 
Pat Jennings 215324 11/02/2016 00:00 29/08/2016 00:00 8  1  Amber 
Alan Gilzean 200575 06/11/2015 00:00 08/11/2015 00:00 8  1  Amber 
Bill Wyman  203575 27/11/2015 00:00 14/01/2016 00:00 8  1  Amber 
Bill Wyman  209740 14/01/2016 00:00 10/03/2016 00:00 9  1  Green 
Bill Wyman  219330 11/03/2016 00:00 01/09/2016 00:00 10  1  Red 
Mike England 209288 12/01/2016 12:54 01/02/2016 12:54 8  1  Amber 
Charlie Watts 198363 14/10/2015 12:40 05/11/2015 00:00 8  1  Amber 
Charlie Watts 200281 05/11/2015 00:00 13/06/2016 00:00 10  1  Red 
Brian Jones  208265 06/01/2016 14:38 04/02/2016 00:00 8  1  Amber 
Brian Jones  214052 04/02/2016 00:00 17/03/2016 00:00 9  1  Green 
Brian Jones  220425 17/03/2016 00:00 04/07/2016 00:00 10  1  Red 
Martin Chivers 209195 12/01/2016 00:00 04/07/2016 00:00 8  1  Amber 
Alan Mullery 212919 29/01/2016 00:00 04/07/2016 00:00 8  1  Amber 
Mick Jagger  199134 20/10/2015 00:00 17/12/2015 00:00 8  1  Amber 
Mick Jagger  212690 28/01/2016 00:00 24/06/2016 00:00 8  1  Amber 
Martin Peters 195833 30/09/2015 00:00 04/07/2016 00:00 8  1  Amber 

結果は、カウント基準で結果を取得し、それに参加することのステートメントを使用し

person   id  start    end     type active stage 

Keith Richards 202971 24/11/2015 00:00 07/03/2016 00:00 8  1  Amber 
Keith Richards 218325 07/03/2016 00:00 07/04/2016 00:00 10  1  Red 
Bill Wyman  203575 27/11/2015 00:00 14/01/2016 00:00 8  1  Amber 
Bill Wyman  209740 14/01/2016 00:00 10/03/2016 00:00 9  1  Green 
Bill Wyman  219330 11/03/2016 00:00 01/09/2016 00:00 10  1  Red 
Charlie Watts 198363 14/10/2015 12:40 05/11/2015 00:00 8  1  Amber 
Charlie Watts 200281 05/11/2015 00:00 13/06/2016 00:00 10  1  Red 
Brian Jones  208265 06/01/2016 14:38 04/02/2016 00:00 8  1  Amber 
Brian Jones  214052 04/02/2016 00:00 17/03/2016 00:00 9  1  Green 
Brian Jones  220425 17/03/2016 00:00 04/07/2016 00:00 10  1  Red 
Mick Jagger  199134 20/10/2015 00:00 17/12/2015 00:00 8  1  Amber 
Mick Jagger  212690 28/01/2016 00:00 24/06/2016 00:00 8  1  Amber 
+1

現在の質問には答えられませんが、実際には "現代的"なANSI-92スタイルの結合を使用してください。彼らは25年以上前から利用されてきました。 http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx –

+0

Seanに感謝します。私はリンクのように "現代的な"結合を使う傾向がありますが、何らかの理由でそれを凝縮してStackの他の例を見ると、私はいくつかの "以前の"スタイルに出くわしました。質問を確定するときに気をつけてください。 – MisterO

答えて

0
;With cte 
as 
(
--this can be your join logic.Replace everything except rownum from join 
select 
*,row_number() over (partition by person order by (select null)) as rownum 
from 
table 
) 
select * from cte where rownum>1 
+0

私はこの方法を試してみましたが、2つ以上のレコードを表示している人だけで半分しか動作しませんが、すべての情報が表示されるわけではありません。 – MisterO

0

を望んでいます。

例:

DECLARE @Orders TABLE (Person VARCHAR(32), Ord VARCHAR(128)); 

INSERT INTO @Orders (Person, Ord) VALUES ('Brett', 'Shirt'), ('Brett', 'Pants'), ('Mary', 'Dress') 

--Everything as is 
Select * 
From @Orders 


-- getting ordersOver2 
; With ordersOver2 as 
    (
    Select 
     Person 
    , COUNT(Ord) AS cnt 
    FROM @Orders 
    GROUP BY Person 
    HAVING COUNT(Ord) > 1 
    ) 
-- relating this to main set 
Select a.* 
From @Orders a 
    JOIN ordersOver2 b ON b.Person = a.Person 
1

あなたはTheGameiswarのソリューションを適応させることができます。 はperson行が繰り返されたテーブルを検索し、おそらく、それらをフィルタリング

;With cte 
as 
(
--this can be your join logic.Replace everything except count(*) from join 
select 
*,count(*) over (partition by person) as PersonCount 
from 
table 
) 
select * from cte where PersonCount>1 
0

ROW_NUMBERの代わりに解析関数の数を使用しますstoryContractテーブルはpersonを繰り返し、

SELECT /* DISTINCT <- no need for distinct probably */ 
      table1.person 
     , table1.id 
     , table1.type 
     , table1.active 
     , table2.stage 
     , table3.start 
     , table3.end 

FROM 
      people table1 
     , storyType table2 
     , storyContract table3 

WHERE 
     table1.type = table2.type_id 
    AND table2.stage = 1 
    AND table1.id = table3.contract_id 
    AND table3.start > '2015-01-01 00:00:00' 
    -- ----- additional filter ---------------------- 
    AND Exists(
      SELECT 1 
      FROM storyContract as c 
      WHERE c.contract_id = table1.id 
      HAVING COUNT(1) > 1 
    ) 
    -- ---------------------------------------------- 
関連する問題