どのデータベースを使用しているかを質問で述べていないため、すべてのデータベース プラットフォームで機能するクエリを作成することをお勧めします。ただし、このクエリでは、auto_number、identity、serial などのプロパティを持つ新しい列を作成する必要があります
これはクエリになります:
select * from tbl
where (id,auto_number_here) in
(select id, min(auto_number_here)
from tbl
group by id)
これは、Sql Server を除く多くのプラットフォームで機能します。Sql Server はタプルに対応していません。これを行う必要があります:
select * from tbl x
where
-- leave this comment, so it mimics the tuple capability
-- (id,auto_number_here) in
EXISTS
(select
-- Replace this:
-- id, min(auto_number_here)
-- With whatever floats your boat,
-- you can use 1, null(the value generated by Entity Framework's EXIST clause),
-- even 1/0 is ok :-) (this will not result to divide-by-zero error)
-- But I prefer retaining the columns, so it mimics the tuple-capable database:
id, min(auto_number_here)
from tbl
where id = x.id
group by id
having x.auto_number_here = min(auto_number_here))
タプル関連の質問: sql in 句でタプルを使用する
一部のデータベースはタプルをサポートしていないため、代わりにシミュレートできます
select z.* from tbl z
join (select id, min(auto_number_here) as first_row from tbl group by id) as x
on z.id = x.id and z.auto_number_here = x.first_row
EXISTS アプローチよりも少し優れています。ただし、データベースがタプルをサポートしている場合は、代わりに使用してください。可能な限り、テーブルの関係のみを反映するために JOIN を使用し、フィルタリングには WHERE 句を使用します。
アップデート
おそらく具体的な例で明確に説明できるでしょう。主キーを置き忘れた既存のテーブルがあるとします。
create table tbl(
id varchar(5), -- supposedly primary key
data int,
message varchar(100)
);
insert into tbl values
('A',1,'the'),
('A',1,'quick'),
('A',4,'brown'),
('B',2, 'fox'),
('B',5, 'jumps'),
('B',5, 'over'),
('C',6, 'the'),
('C',7, 'lazy');
重複から 1 行だけを取得するには、既存のデータに 3 番目の列を追加する必要があります。
これは、重複から 1 行だけを選択するのに役立ちます。
alter table tbl add auto_number_here int identity(1,1) not null;
これは今すぐ動作します:
select z.* from tbl z
join (select id, min(auto_number_here) as first_row from tbl group by id) as x
on z.id = x.id and z.auto_number_here = x.first_row
ライブ テスト: http://www.sqlfiddle.com/#!6/19b55/3
そして、これは次のとおりです。
select * from tbl x
where
-- leave this comment, so it mimics the tuple capability
-- (id,auto_number_here) in
EXISTS
(
select
-- Replace this:
-- id, min(auto_number_here)
-- With whatever floats your boat,
-- you can use 1, null(the value generated by Entity Framework's EXIST clause),
-- even 1/0 is ok :-) (this will not result to divide-by-zero error)
-- But I prefer retaining the columns, so it mimics the tuple-capable database:
id, min(auto_number_here)
from tbl
where id = x.id
group by id
having x.auto_number_here = min(auto_number_here)
)
ライブ テスト: http://www.sqlfiddle.com/#!6/19b55/4