0

最初のテーブルで IdNumbers (主キー ID ではなく、個人に割り当てられたランダムな ID) が常に正しいとは限らないという情報があります。

したがって、ID と名前の両方で 2 番目のテーブルに参加し、IdNumbers が一致しない場合にのみ名前で結合する場所に移動しようとしています。

大まかに次のような結合ステートメントを使用してクエリに取り組んでいます (SELECT、WHERE、および ORDER BY セクションは除外しています。これらはこの問題に影響を与えていないと考えているためです。ばかばかしいほど複雑なので、混乱を招きます-以下のクエリの部分が私が望むように機能するはずで、問題が明らかに別の場所にある場合は、そのように言ってください。それが私の質問に答えます):

FROM Table1
FULL OUTER JOIN Table2 ON ((Table1.IdNumber = Table2.IdNumber) 
OR (Table1.IdNumber != Table2.IdNumber 
    AND Table1.Lname = Table2.Lname 
    AND Table1.Fname = Table2.Fname))

ただし、次のように、一致する ID と一致する名前の両方を持つ人々を複数回結合しています。

Fname   M   Lname   Table1.IdNumber  Table2.IdNumber2
Matthew -   Smith   1                2
Matthew H   Smith   2                1
Matthew -   Smith   1                1
Matthew H   Smith   2                2

ID が一致するため最後の 2 つをプルしていますが、ID が一致せず、名前が一致するため最初の 2 つにも参加していますが、そもそも最初の 2 つに参加しているのはなぜですか? 他の条件は満たしているので参加先を決める際に!=文を無視しているのではないかと思いますが、何とかこの!=文を考慮してほしいです。

前に言ったように、これが機能する場合は、教えてください。私の質問に答えてくれます。

(*編集) 申し訳ありませんが、これらの名前を適切に付ける必要がありました。名前を修正しました。完全な外部結合が必要です。両方のテーブルのすべてが必要であり、正常に機能していますが、提案に感謝します。

4

3 に答える 3

0

これが1つのJOINでどれほど厄介になるかを考えると、関係を保持するために一時テーブルを使用することをお勧めします。

すべてのIDを最初のテーブルから一時テーブルに挿入してから、2つのパスを実行して、2番目のテーブルIDを保持する列を更新できます。最初はIDが一致する場所を使用し、2番目はIDが一致しないが名前を使用します。します。

次に、このテーブルを使用して2つのテーブルを結合し、テーブル1のレコードごとにテーブル2から最大1つのレコードを取得できます。

于 2013-01-11T16:16:35.167 に答える
0

列が適切なテーブルからのものである場合、クエリは機能するはずです。テーブルエイリアスを使用していないため、次のような式があると思われます。

fname1 = fname2

両方の列が同じテーブルにあります。またはさらに悪いことに:

fname1 = fname1

これは基本的に常にTRUEです(fname1がnullでない場合を除く)。

クエリは機能する可能性がありますが、ネストされたループの最適化を使用するため、ほとんどのデータベースでは非効率的です。クエリを次のように書き直すことを検討してください。

from table1 t1 full outer join
     table2 byID
     on t1.IdNumber = byID.IdNumber full outer join
     table2 byName
     on t1.fname = byName.fname and t1.lname = byName.lname and t1.idNumber <> byName.idNumber

これには、クエリ内の他の句を通常は次のように変更する必要があります。

coalesce(byId.column, byName.column) as Column
于 2013-01-11T16:11:24.427 に答える
0

私はあなたがこのようなものが欲しいと思います:

select t1.*,t2.*  
from t1,t2  
where  t1.id = t2.id  
and  t1.name = t2.name
union  
select t1.*,t2.*  
from t1,t2  
where  t1.id ! t2.id  
于 2013-01-11T16:07:01.203 に答える