1. ホーム
  2. sql

[解決済み] SQL - 左結合から重複を削除する

2022-02-08 09:55:22

質問

2つのテーブルの結合ビューを作成していますが、テーブル2から不要な重複を取得しています。
たとえば、table1 には 9000 件のレコードがあり、結果のビューにまったく同じレコードを含める必要があります。table2 には同じ FKID の複数のレコードがあるかもしれませんが、1 つのレコードのみを返したいです (顧客にはランダムに選択してもらってかまいません)。 私は正しく動作する以下のコードを持っていますが、パフォーマンスは期待よりも遅いです(14秒以上)。

SELECT     
    OBJECTID
    , PKID
    ,(SELECT TOP (1) SUBDIVISIO
        FROM dbo.table2 AS t2
        WHERE (t1.PKID = t2.FKID)) AS ProjectName
    ,(SELECT TOP (1) ASBUILT1
        FROM dbo.table2 AS t2
        WHERE (t1.PKID = t2.FKID)) AS Asbuilt
FROM dbo.table1 AS t1

パフォーマンスを高速化するために、joinで同じようなことをする方法はありますか?
SQL Server 2008 R2 を使っています。
以下のコードで近づきましたが(~0.5秒)、「Distinct」はすべてのカラムが重複している場合(FKIDだけでなく)レコードをフィルタアウトするだけです。

SELECT
    t1.OBJECTID
    ,t1.PKID
    ,t2.ProjectName
    ,t2.Asbuilt
FROM dbo.table1 AS t1
    LEFT JOIN (SELECT
        DISTINCT FKID
        ,ProjectName
        ,Asbuilt
        FROM dbo.table2) t2
    ON t1.PKID = t2.FKID

テーブルの例

table1          table2

OID, PKID       FKID, ProjectName, Asbuilt
1, id1          id1, P1, AB1
2, id2          id1, P5, AB5
3, id4          id2, P10, AB2
5, id5          id5, P4, AB4

上記の例では、id5/P4/AB4, id2/P10/AB2, および (id1/P1/AB1 OR id1/P5/AB5) のレコードが返されるはずです。

検索してみると、似たような質問がありましたが、私の問題を解決してくれるものはありませんでした。 リンク , リンク
よろしくお願いします。 初めての投稿なので、何かルール違反があったら教えてください。

どのように解決するのですか?

これは、あなたが要求した結果を与え、最高のパフォーマンスを発揮するはずです。

SELECT     
    OBJECTID
    , PKID
    , t2.SUBDIVISIO,
    , t2.ASBUILT1

FROM        dbo.table1 AS t1
OUTER APPLY (
    SELECT  TOP 1 *
    FROM    dbo.table2 AS t2
    WHERE   t1.PKID = t2.FKID
    ) AS t2