1

私はSQLでこれに対する解決策を探していました。最初の 2 文字と生年月日が同じテーブルからレコードを検索しようとしています。自己結合を行うことを考えましたが、正しい結果が得られているとは思えません。これが私のクエリです。不足しているものを教えてください:

select p1.frst_name,
from person p1 inner join person p2
on upper(left(p1.frst_name,2)) like upper(left(p2.frst_name,2))
and upper(p1.last_name) LIKE upper(p2.last_name)
and p1.birth_date = p2.birth_date
4

2 に答える 2

0

(完全一致が必要) に変更LIKE=、結合条件を追加して、行がそれ自体に結合されないようにします。

select p1.id, p1.frst_name, p1.last_name, p1.birth_date
from person p1
join person p2
on upper(left(p1.frst_name,2)) = upper(left(p2.frst_name,2))
and upper(p1.last_name) = upper(p2.last_name)
and p1.birth_date = p2.birth_date
and p1.id != p2.id

を追加しないとand p1.id != p2.id、もちろんすべての行がそれ自体と一致するため、すべての行が返されます。


この質問には、mysql と oracle の両方のタグが付けられました。上記のクエリは mysql で機能します。をサポートしていない iracle の場合は、代わりleft(col, 2)に を使用してください。substr(col, 1, 2)

于 2013-09-26T19:33:07.810 に答える
0

last_name とbirth_date を正確に一致させたいので結合し、一致する最初の 2 文字でフィルタリングします。

p1.frst_name または p2.frst_name に upper() は必要ありません。これらは同じテーブルの同じ列であるため、大文字と小文字が一致します。

試す...

select p1.frst_name,
  from person p1 
  full outer join person p2
    on p1.last_name = p2.last_name
   and p1.birth_date = p2.birth_date
 where upper(left(p1.frst_name,2)) like upper(left(p2.frst_name,2))
于 2013-09-26T19:33:36.057 に答える