0

我有两个包含人员数据的表,名字,姓氏等。

第一个表包含我想要选择的数据,如果它与第二个表中的内容匹配。问题是第一个表可能只有名字的首字母。

我已经尝试过以下查询的变体,但我显然遗漏了一些东西。我不介意表 1 中的“J Bloggs”和“Joe Bloggs”是否都匹配表 2 中的“Joe Bloggs”,这很好。

SELECT t1.* ,  LEFT(t2.FIRST_NAME, 1) AS firstChar 
FROM t1, t2
WHERE t1.surname = t2.LAST_NAME
AND t1.firstname  = t2.FIRST_NAME
OR t1.firstname  = t2.firstChar
GROUP BY t1.surname
4

2 回答 2

1

你需要把()你的第二个WHERE条件放在:

SELECT t1.* ,  LEFT(t2.FIRST_NAME, 1) AS firstChar 
FROM t1, t2
WHERE 
  t1.surname = t2.LAST_NAME
  AND (t1.firstname  = t2.FIRST_NAME OR t1.firstname  = LEFT(t2.FIRST_NAME, 1)
ORDER BY t1.surname

但是,不鼓励和不推荐使用隐式连接语法。相反,使用

SELECT t1.* ,  LEFT(t2.FIRST_NAME, 1) AS firstChar 
FROM 
  t1 JOIN t2 
    ON t1.surname = t2.LAST_NAME
      AND (t1.firstname  = t2.FIRST_NAME OR t1.firstname  = LEFT(t2.FIRST_NAME, 1)
ORDER BY t1.surname

由于您的条件是姓氏必须匹配,并且名字必须完全匹配或匹配第一个字符,因此必须将名字条件分组在().

我还用 替换了您GROUP BYORDER BY,因为您没有执行任何组聚合函数 ( SUM(), COUNT(), AVG())。MySQL 不允许在WHERE子句中使用别名,所以我也替换t2.firstCharLEFT(t2.firstChar, 1)

最后,您可能会发现需要转换连接两侧UPPER()LOWER()两侧的所有名称的大小写,以确保它匹配可能不一致的大小写。

于 2012-04-18T13:41:04.920 回答
0

首先,您的WHERE子句中需要括号。其次,我认为t2.firstChar除非您实际上在表 t2 中有一个名为“firstChar”的列,否则您不会得到任何东西。在 your 中指定它SELECT不会使其成为表中的实际行。相反,我认为您正在寻找更像这样的东西:

SELECT DISTINCT t1.*
FROM
    t1
    INNER JOIN t2 ON
        t1.surname = t2.LAST_NAME
        AND (
            t1.firstname = t2.FIRST_NAME
            OR t1.firstname = LEFT(t2.FIRST_NAME, 1)
        )
于 2012-04-18T13:46:43.933 回答