2013-09-26 168 views
1

我一直在爲SQL尋找解決方案。我試圖從一個表中找到具有相同的前兩個字符和相同的出生日期的記錄。我想過自我加入,但我懷疑自己得到了正確的結果。這裏是我的查詢,請告訴我缺少了什麼:從表中選擇名稱具有相同首字母的表

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 
+1

是此Oracle或MySQL? –

回答

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中工作。對於不支持left(col, 2)的iracle,請改爲使用substr(col, 1, 2)

+0

我不確定oracle和left(),所以我試了一下。我現在不同意你最後一句話。 –

+0

@DanBracuk好吧我在底部添加了一個註釋,因爲Oracle缺乏對非常基本的amd sql標準函數的支持。 Thx爲了引起我的注意。 – Bohemian

0

加入last_name和birth_date,因爲您希望它們完全匹配,然後按匹配的前兩個字符進行過濾。

您不應該在p1.frst_name或p2.frst_name上使用upper()。因爲它們是同一個表中的同一列,所以它們的案例將匹配。

的Try ...

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)) 
+0

你的第二段不一定是正確的。 –

+0

啊,這是否只是因爲可能(並根據OP,應該是)具有相同的姓氏和生日的不同記錄?還是有什麼我失蹤? – MollyOQ

相關問題