1

照会しているデータベースから個別または固有のレコードを選択したいと考えています。どうすればこれを行うことができますが、同時に、一意であると区別している列だけでなく、レコード全体を選択できますか? 手に負えない結合を行う必要がありますか?

4

3 に答える 3

5

使用しているデータベースによっては、ウィンドウ関数を使用できます。繰り返さない行のみが必要な場合:

select t.*
from (select t.*,
             count(*) over (partition by <id>) as numdups
      from t
     ) t
where numdups = 1

各行の 1 つの例が必要な場合:

select t.*
from (select t.*,
             row_number(*) over (partition by <id> order by <id>) as seqnum
      from t
     ) t
where seqnum = 1

ウィンドウ関数がない場合は、「手に負えない結合」で同じことを行うことができます。

于 2012-06-25T17:29:48.633 に答える
3

複数の列のうち 1 つの列のみを一意にする必要があり、複数のレコードを含む可能性のある結合がある場合は、クエリで提供する 2 つ以上の値のどれを決定する必要があります。これは、相関サブクエリまたは派生テーブルまたは CTE を使用して集計関数を使用して実行できます (SQL Server では、Oracle にそれらがあるかどうかは不明です)。

ただし、クエリを作成する前に、必要な値を決定する必要があります。それを知ったら、おそらくそれを取得する方法を知っているでしょう。

ここにいくつかの簡単な例を示します (私は SQL Server のコーディング規則を使用しましたが、これはすべて基本的な SQL であるため、Oracle ではほとんど意味があるはずです。Oracle ではパラメーターを宣言する方法が異なる場合があります)。

select a.a_id, max (b.test) , min (c.test2)
from tablea a 
join tableb b on a.a_id = b.a_id
join tablec c on a.a_id = c.a_id
group by a.a_id
order by b.test, c.test2

Select a.a_id, (select top 1 b.test from tableb b where a.a_id = b.a_id order by test2),
(select top 1 b.test2 from tableb b where a.a_id = b.a_id order by test2),
(select top 1 c.test3 from tablec c where a.a_id = c.a_id order by test4)
from tablea a   

declare @a_id int
set @a_id = 189
select a.a_id , b.test, b.test4
from tablea a 
join tableb b on a.a_id = b.a_id
join (select min(b.b_id) from tableb b where b.a_id = @a_id order by b.test3) c on c.b_id = b.b_id
where a.a_id = @a_id
于 2012-06-25T17:10:07.800 に答える