2013-05-07 70 views
0

請耐心等待,我是Access和SQL的新手。SQL:如何在文本中查找單詞的精確匹配

我想要做的是寫一個SQL查詢來通過兩個表進行過濾 - 一個包含分成兩列,另一個包含文本的單詞。從本質上講,我想要的是一個新的表格,它將文字列中的兩列單詞的所有精確匹配給我。

下面是一個類似的數據庫來模擬一下我想要的結果:

Table A: 
FirstName:    LastName: 
John      Doe 
Jane      Doe 
Josh      Smith 
James     Jones 
David     Johnson 

Table B: 
FullName: 
Jake Davidson 
Mike Peters 
Jason James 
John Michael Smith 

Query Result: 
FirstName: LastName:  FullName: 
John   Doe   John Michael Smith 
Josh   Smith   John Michael Smith 
James  Jones   Jason James 

(注意到大衛 - 戴維森的比賽沒有拿出即我想只有完全匹配。)

所以幫我填補空白:

SELECT TableA.FirstName,TableA.LastName, TableB.FullName 
FROM TableA,TableB 
WHERE TableB.FullName LIKE (has an exact match with TableA.FirstName--not sure what to put) 
UNION 
SELECT TableA.FirstName,TableA.LastName, TableB.FullName 
FROM TableA,TableB 
WHERE TableB.FullName LIKE (has an exact match with TableA.LastName--not sure what to put) 
; 

回答

0

這將取決於你希望它帶有兩個以上名稱FullNames,如「約翰·雅各布·史密斯」做什麼,但是,假設你要它忽略中間字[S], 然後嘗試

Select firstname, lastname, fullname 
from tableA a 
    Join tableb f 
     On f.firstname = Mid(a.fullname, 1, InStr(a.fullname, " ")-1) 
    Join tableb l 
     On l.lastname = Mid(a.fullname, InStrRev(a.FullNamee, " ")+1) 
+0

這實際上並不是我正在尋找的名稱,所以中間的單詞很重要。這只是一個類似的數據庫來簡化這個概念。感謝您的幫助! – Cabral 2013-05-07 13:33:53

0

這裏是比較每個FullNameFirstnameLastName的方法:

select a.Firstname, a.LastName, b.FullName 
from tableA as a inner join 
    tableB as b 
    on instr(' '&b.FullName&' ', ' '&a.FirstName&' ') > 0 and 
     instr(' '&b.FullName&' ', ' '&a.Lastname&' ') > 0 

它假設爲名稱的分隔符是空間(如你的例子)。比較在FullName的開頭和末尾附加一個空格,然後查找空格填充的名字和姓氏。

+0

在全名前後添加空格非常巧妙,並且一定會解決我的問題。但是,我仍然收到一條錯誤消息,指出FROM子句中存在語法錯誤。小寫字母a和b是什麼意思?當我寫出這些信息時,是否必須將它們更改爲TableA和TableB? – Cabral 2013-05-07 13:26:57

+0

@Cabral。 。 。這些是表的別名,這使得查詢更容易閱讀。在Access中,我認爲在別名之前需要關鍵字'as'(這在其他數據庫中不需要)。 – 2013-05-07 13:31:13

+0

這裏是我現在有 - 選擇名字,姓氏,全名從TableA AS A,TableB AS B ON instr(''&B.FullName&'',''&A.FirstName&'')> 0和instr(''& B.FullName&'',''&A.Lastname&'')> 0;我仍然收到語法錯誤的錯誤消息。感謝您的幫助 – Cabral 2013-05-07 13:47:10