6

JOINクエリから複数回表示されるレコードを抽出したいのですが、それらはグループ化されません。

表の例:

tbl_names
id    Name
1     Mark
2     John
3     Jane
4     Paul

tbl_locations
id    Location
1     Berlin
2     Frankfurt
2     Stockholm
3     Helsinki
3     Madrid
3     London
4     Paris

IDは外部キーです。

これで、クエリの結果は次のようになります。

id     Name    Location
2      John    Frankfurt
2      John    Stockholm
3      Jane    Helsinki
3      Jane    Madrid
3      Jane    London

つまり、最初のテーブルのレコードがJOIN句の結果に複数回表示されるすべてのJOINレコード。

もちろん、グループ化することもできます。

SELECT tbl_names.id, tbl_names.Name, tbl_locations.Location FROM tbl_names
 INNER JOIN tbl_locations ON (tbl_names.id = tbl_locations.id)
 GROUP BY tbl_names.id
 HAVING COUNT(tbl_names.id) > 1

私が欲しいのは、それらをまったくグループ化しないことです。副節を試してみましたNOT INが、非常に遅く、希望する結果が得られません。

どんな悟りも歓迎されます。

4

1 に答える 1

8

これを使用してください:

SELECT tbl_names.id, tbl_names.Name, tbl_locations.Location
FROM tbl_names
INNER JOIN tbl_locations ON (tbl_names.id = tbl_locations.id)
where tbl_names.id in (select id from tbl_locations
                       group by id having count(*) > 1);

この選択では、すでに持っている結合が表示されますが、場所テーブルに複数のエントリがある名前/IDのみが選択されます。

https://stackoverflow.com/a/3520552/1741542によると、これは単純なサブクエリよりも高速である可能性があります。

create view view_id_locations as
    select id
    from tbl_locations
    group by id
    having count(*) > 1;

SELECT tbl_names.id, tbl_names.Name, tbl_locations.Location
FROM tbl_names
INNER JOIN tbl_locations ON tbl_names.id = tbl_locations.id
inner join view_id_locations on tbl_names.id = view_id_locations.id;
于 2012-11-06T10:23:46.100 に答える