1. ホーム
  2. sql

[解決済み] SQL 左結合 最初のマッチのみ

2022-02-08 08:13:08

質問

多数の大きなテーブル(行と列)に対して、いくつかの結合を伴うクエリを持っていますが、テーブルの1つにデータの重複行があり、クエリで問題が発生します。これは他の部署からの読み取り専用のリアルタイム・フィードなので、そのデータを修正することはできませんが、私のクエリで問題が発生するのを防ごうとしています。

そこで、このゴミのようなデータを私の良いクエリに左結合で追加する必要があります。データセットは以下のようなものです。

IDNo    FirstName   LastName    ...
-------------------------------------------
uqx     bob     smith
abc     john        willis
ABC     john        willis
aBc     john        willis
WTF     jeff        bridges
sss     bill        doe
ere     sally       abby
wtf     jeff        bridges
...

(約2ダース列、100K行)

最初の直感で、distinctを実行すると、約80K行が表示されました。

SELECT DISTINCT P.IDNo
FROM people P

しかし、以下を試すと、すべての行が戻ってきます。

SELECT DISTINCT P.*
FROM people P

または

SELECT 
    DISTINCT(P.IDNo) AS IDNoUnq 
    ,P.FirstName
    ,P.LastName
    ...etc.    
FROM people P

そこで、すべての列に対してFIRST()集計関数を実行しようと思ったのですが、これも間違っているような気がします。構文的に何か間違っているのでしょうか?

更新しました。 これらのレコードは、上記のIDの非キー/非インデックスフィールドに基づいて重複していることをお知らせしたいと思います。IDはテキストフィールドで、同じ値を持ちますが、問題の原因となっている他のデータとは異なるケースです。

解決方法は?

最初に重要な列だけを入れ子で選択し、そこから個別の選択を行って、「ユニーク」データのゴミ列が良いデータを破壊するのを防ぐ必要があることがわかりました。以下の方法で問題が解決したように見えますが、後で完全なデータセットで試してみるつもりです。

SELECT DISTINCT P2.*
FROM (
  SELECT
      IDNo
    , FirstName
    , LastName
  FROM people P
) P2

リクエストにお応えして、プレイデータをご紹介します。 http://sqlfiddle.com/#!3/050e0d/3

CREATE TABLE people
(
       [entry] int
     , [IDNo] varchar(3)
     , [FirstName] varchar(5)
     , [LastName] varchar(7)
);

INSERT INTO people
    (entry,[IDNo], [FirstName], [LastName])
VALUES
    (1,'uqx', 'bob', 'smith'),
    (2,'abc', 'john', 'willis'),
    (3,'ABC', 'john', 'willis'),
    (4,'aBc', 'john', 'willis'),
    (5,'WTF', 'jeff', 'bridges'),
    (6,'Sss', 'bill', 'doe'),
    (7,'sSs', 'bill', 'doe'),
    (8,'ssS', 'bill', 'doe'),
    (9,'ere', 'sally', 'abby'),
    (10,'wtf', 'jeff', 'bridges')
;