0

人々のデータ、名、姓などを含む2つのテーブルがあります。

最初のテーブルには、2番目のテーブルのものと一致する場合に選択したいデータが含まれています。問題は、最初のテーブルに名のイニシャルしかない可能性があることです。

次のクエリのバリエーションを試しましたが、明らかに何かが足りません。表1の「JBloggs」と「JoeBloggs」の両方が表2の「JoeBloggs」と一致してもかまいません。

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

次のように、2番目の条件を()回避する必要があります。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 BYをに置き換えました。MySQLは句内のエイリアスを許可していないので、私もに置き換えました。ORDER BYSUM(), COUNT(), AVG()WHEREt2.firstCharLEFT(t2.firstChar, 1)

UPPER()最後に、結合の両側または両側にあるすべての名前の大文字と小文字を変換して、大文字と小文字がLOWER()一致しない可能性がある場所と一致するようにする必要がある場合があります。

于 2012-04-18T13:41:04.920 に答える
0

まず、WHERE句に括弧が必要です。t2.firstChar次に、テーブルt2に「firstChar」という名前の列が実際にない限り、何も得られないと思います。で指定しても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 に答える