3

SQL Server 2008 R2 を使用しています。

次のような奇妙な問題があります。に示すようなテーブルがあります

ここに画像の説明を入力

次のようなクエリを書く必要があります。

SELECT DISTINCT Field1 
FROM MYTABLE 
WHERE Field2 IN (96,102)

このクエリでは、 WHERE Field2 IN (96,102)96 または 102 またはその両方が得られます。

さらに、96 と 102 を同時に含む行を返したいと思います。

何か提案はありますか?結果重視で書いてください...

4

4 に答える 4

2

私はこれのためにsqlfiddleを作りました..

create table a (id int, val int)
go
insert into a select 1, 22
insert into a select 1, 122
insert into a select 2, 22
insert into a select 3, 122
insert into a select 4, 22
insert into a select 4, 122

次に、このように選択します

select count(distinct id), id
from a
where val in (22, 122)
group by id
having count(id) > 1

編集: count(distinct id) は個別のカウントのみを表示します..

于 2012-10-27T07:28:37.123 に答える
1

自己結合を使用しますか? 最もきれいではありませんが、2つの値でうまく機能すると思います

SELECT *
FROM T R1
JOIN T R2                        -- join table with itself
ON R1.F1 = R2.F1                 -- where the first field is the same
WHERE R1.F2 = 96 AND R2.F2 = 102 -- and each has one of the required values

(T = テーブル、Rx = リレーション エイリアス、Fx = フィールド)

任意の数のフィールドが存在できる場合、これは次のように解決できます。

CREATE TABLE #T (id int, val int)
GO
INSERT INTO #T (id, val)
VALUES
  (1, 22), (1, 22),     -- no,  only 22 (but 2 records)
  (2, 22), (2, 122),    -- yes, both values (only)
  (3, 122),             -- no,  only 122
  (4, 22), (4,122),     -- yes, both values ..
  (4, 444), (4, null),     -- and extra values
  (5, 555)              -- no,  neither value
GO
-- Using DISTINCT over filtered results first, as
-- SQL Server 2008 does not support HAVING COUNT(DISTINCT F1, F2)
SELECT id
FROM (SELECT DISTINCT id, val
      FROM #T
      WHERE val IN (22, 122)) AS R1
GROUP BY id
HAVING COUNT(id) >= 2 -- or 3 or ..
GO
-- Or a similar variation, as can COUNT(DISTINCT ..)
-- in the SELECT of a GROUP BY
SELECT id
FROM (SELECT id, COUNT(DISTINCT val) as ct
      FROM #T
      WHERE val IN (22, 122)
      GROUP BY id) AS R1
WHERE ct >= 2 -- or 3 or ..
GO

サイズが大きい場合IN (..)、たとえば 20 を超える値の場合は、パフォーマンス上の理由から、別のテーブルまたはテーブル値と を使用することをお勧めしますJOIN

于 2012-10-27T05:53:38.380 に答える
1

編集:

これは sqlfiddle の例です (Mark Kremers に感謝):

http://sqlfiddle.com/#!3/df201/1

create table mytable (field1 int, field2 int)
go
insert into mytable values (199201, 84)
insert into mytable values (199201, 96)
insert into mytable values (199201, 102)
insert into mytable values (199201, 103)
insert into mytable values (581424, 96)
insert into mytable values (581424, 84)
insert into mytable values (581424, 106)
insert into mytable values (581424, 122)
insert into mytable values (687368, 79)
insert into mytable values (687368, 96)
insert into mytable values (687368, 102)                                                       
insert into mytable values (687368, 104)                            
insert into mytable values (687368, 106)

クエリは次のとおりです。

select distinct a.field1 from
( select field1 from mytable where field2=96) a
  inner join 
( select field1 from mytable where field2=102) b
  on a.field1 = b.field1

結果は次のとおりです。

FIELD1
199201
687368

最後に、クエリの簡略化されたバージョンを次に示します (pst より):

select distinct a.field1 from  mytable a 
inner join mytable b   
  on a.field1 = b.field1 
where a.field2=96 and b.field2=102
于 2012-10-27T05:48:39.310 に答える
0

元のクエリから試してください:

SELECT DISTINCT Field1 
FROM MYTABLE 
WHERE rtrim(ltrim(cast(Field2 as varchar))) IN ('96','102')
于 2012-10-29T16:02:48.370 に答える