0

SQLServer2005に以下のようなテーブルがあります

date_column | field1 | field2 
1 June 2012 | xyz    | 53
1 June 2012 | abc    | 87
2 June 2012 | xyz    | 81
3 June 2012 | xyz    | 54
3 June 2012 | abc    | 53
3 June 2012 | abc    | 54
4 June 2012 | mmn    | 53
4 June 2012 | xyz    | 54
4 June 2012 | mmn    | 54
4 June 2012 | mmn    | 55
3 June 2012 | abc    | 55
3 June 2012 | adf    | 86
3 June 2012 | asd    | 33

対応するfield2値「53」、「54」、および「55」を持つすべてのfield1値を検索したいと思います。同じ日付内なので、出力は次のようになります。

date_column | field1 | field2
3 June 2012 | abc    | 53
3 June 2012 | abc    | 54
3 June 2012 | abc    | 55
4 June 2012 | mmn    | 53
4 June 2012 | mmn    | 54
4 June 2012 | mmn    | 55

以下のSQLコードを内部結合で試しましたが、機能しません

select date_column, field1, field2 from table1
inner join (select date_column, field1, field2 from table1 where field2
in ('54',  '55')) as table2
on table1.date_column = table2.date_column and
table1.field1 = table2.field1
where field1 in ('53', '54', '55')
group by date_column, field1, field2
order by date_column, field1, field2
4

5 に答える 5

1

これでうまくいくと思いますか?あなたはこれを複雑にしすぎているかもしれません、または私は問題を誤解しています

SELECT field1, date_column FROM table1
WHERE field2 in ('53', '54', '55')
GROUP BY field1, date_column
HAVING COUNT(DISTINCT field2) = 3

これがSQLFiddleです

field1を見つけるだけでよいと言うので、これは機能するはずですが、すべての列が必要な場合は、次のように実行できます。

SELECT Table1.*
FROM Table1
JOIN
(
SELECT field1, date_column FROM table1
WHERE field2 in ('53', '54', '55')
GROUP BY field1, date_column
HAVING COUNT(DISTINCT field2) = 3
) AS MoreThan1
 ON Table1.field1 = MoreThan1.field1 and Table1.date_column = MoreThan1.date_column

これがSQLFiddleです

または、53-55の列のすべての列のみが必要な場合は、WHEREを追加します。

WHERE Table1.field2 in ('53', '54', '55')

別のフィドル

于 2012-06-28T18:07:24.080 に答える
0
select table1.date_column, table1.field1, table1.field2 
from table1 
inner join (select date_column, field1, field2 
            from table1 
            where field2 in ('54',  '55')) as table2 
    on table1.date_column = table2.date_column and table1.field1 = table2.field1 
where table1.field1 in ('53', '54', '55') 
group by table1.date_column, table1.field1, table1.field2 
order by table1.date_column, table1.field1, table1.field2 
于 2012-06-28T19:39:18.917 に答える
0

私は以下があなたが望むことをするだろうと思います:

select *
from t
where field1 in (select field1
                 from t
                 where field2 in ('53', '54', '55')
                 group by field1
                 having max(date) = min(date)
                )

サブクエリは、条件に一致するfield1IDを見つけます。外部クエリは、これらのIDのすべてのデータを選択するだけです。

私はもともと要件を読み間違えたと思います。これが当てはまる日付が必要です。このバージョンはそれを行う必要があります:

select *
from t join
     (select field1, date
      from t
      where field2 in ('53', '54', '55')
      group by field1
      having count(distinct field2) = 3
    ) a
    on t.field1 = a.field1 and t.date = a.date
于 2012-06-28T18:04:13.047 に答える
0

テーブルは1つだけです(table1)、正しいですか?その場合、参加は必要ありません。

SELECT * FROM table1
WHERE field2 in ('53', '54', '55');
于 2012-06-28T18:04:37.750 に答える
0
SELECT DISTINCT t1.date_column, t1.field1, t1.field2
FROM table1 t1
WHERE EXISTS 
    (SELECT t2.date_column, t2.field1
    FROM table1 t2
    WHERE t2.field2 IN ('53', '54', '55')
        AND t2.date_column = t1.date_column
        AND t2.field1 = t1.field1
    GROUP BY t2.date_column, t2.field1
    HAVING COUNT(DISTINCT field2) = 3)
ORDER BY t1.date_column, t1.field1, t1.field2
于 2012-06-28T18:18:22.423 に答える