2014-11-05 98 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, '%')