2014-11-05 100 views
2

我有2個表,'contacts'和'job_titles'。在「聯繫人」表格中有一個名爲「位置」的字段。如果'position'字段的值與'job_titles'表中的'title'字段類似,並且我已經來到新'job_titles'表,我想更新'contacts'表中名爲'job_title_id'的字段越過障礙。子查詢返回多於一行LIKE&CONCAT與通配符

因爲位置字段是自由文本字段,我們的值可以是:這樣一個公司

而且,我們可能在「標題」字段

  • 服務交付經理在 'job_titles' 表中的值,如:

    • 服務交付經理
    • IT服務交付MANAG呃
    • 高級服務交付經理

    所以,當我運行下面的查詢,我得到一個「子查詢返回超過1行」的錯誤。

    UPDATE contacts 
    SET job_title_id = 
        (SELECT id 
        FROM job_titles 
        WHERE job_titles.title LIKE CONCAT('%', contacts.position, '%') 
    ); 
    

    有沒有一種方法可以運行通配符查詢,就像我上面會做我所需要的?謝謝。

+0

當存在多行時,您希望返回哪個匹配項? – 2014-11-05 12:49:06

+0

可能是通用值,如服務交付管理器。 – 2014-11-05 12:50:08

回答

4

下面將匹配最短標題,對更爲通用的假設:

UPDATE contacts c 
    SET job_title_id = (SELECT id 
         FROM job_titles jt 
         WHERE jt.title LIKE CONCAT('%', c.position, '%') 
         ORDER BY char_length(jt.title) 
         LIMIT 1 
         ); 
+0

這實際上是最好的答案。謝謝。 – 2014-11-05 16:24:38

2

通配符查詢可能會返回一個以上的記錄。這樣一種解決方案可能是,如果你使用了嵌套查詢與限制1.

UPDATE contacts SET job_title_id = (SELECT id FROM job_titles WHERE job_titles.title LIKE CONCAT('%', contacts.position, '%') limit 1); 

但是這裏可能會出現的問題,它可能會返回高級服務交付記錄搜索服務交付,所以如果你的領域的數據以工作頭銜開頭,那麼你可以寫出這樣的查詢。

UPDATE contacts SET job_title_id = (SELECT id FROM job_titles WHERE job_titles.title LIKE CONCAT(contacts.position, '%') limit 1); 
+0

很好的答案,這是一種享受。我用第二個例子。謝謝。 – 2014-11-05 12:59:48

0

此查詢會有幫助。

UPDATE A SET A.job_title_id = B.id FROM contacts AS A 
INNER JOIN job_titles AS B ON B.id IS Not NUll 
WHERE B.title LIKE CONCAT('%', A.position, '%')