SQL一对多表分组 让我们考虑下面的例子:我有下面的表格-TabLeA,带有这些语言的人和TabLB。描述人员的每一行在表B中可以没有、一行或多行。示例如下: People +-----+--------+ | pId | Name | +-----+--------+ | 0 | Thomas | | 1 | Henry | | 2 | John | +-----+--------+ Skills +-----+-----+----------+---------------+ | lID | pId | Language | LanguageSkill | +-----+-----+----------+---------------+ | 0 | 0 | Dutch | 0 | | 1 | 0 | French | 4 | | 2 | 0 | Italian | 2 | | 3 | 2 | Italian | 2 | +-----+-----+----------+---------------+

SQL一对多表分组 让我们考虑下面的例子:我有下面的表格-TabLeA,带有这些语言的人和TabLB。描述人员的每一行在表B中可以没有、一行或多行。示例如下: People +-----+--------+ | pId | Name | +-----+--------+ | 0 | Thomas | | 1 | Henry | | 2 | John | +-----+--------+ Skills +-----+-----+----------+---------------+ | lID | pId | Language | LanguageSkill | +-----+-----+----------+---------------+ | 0 | 0 | Dutch | 0 | | 1 | 0 | French | 4 | | 2 | 0 | Italian | 2 | | 3 | 2 | Italian | 2 | +-----+-----+----------+---------------+,sql,group-by,one-to-many,Sql,Group By,One To Many,托马斯懂荷兰语、法语和意大利语,亨利不懂任何外语,约翰懂意大利语 我想从表A中获得每个人最熟悉的语言: +--------+----------+ | Name | Language | +--------+----------+ | Thomas | French | | Henry | NULL | | John | Italian | +--------+----------+ 我觉得这是一件很容易的事情,但不知道如何用一种简单的方式来实现 感谢您的回复。您需要使

托马斯懂荷兰语、法语和意大利语,亨利不懂任何外语,约翰懂意大利语

我想从表A中获得每个人最熟悉的语言:

+--------+----------+
|  Name  | Language |
+--------+----------+
| Thomas | French   |
| Henry  | NULL     |
| John   | Italian  |
+--------+----------+
我觉得这是一件很容易的事情,但不知道如何用一种简单的方式来实现


感谢您的回复。

您需要使用以下查询为每个人获取最佳语言:

SELECT pid, language
from TableB
group by pid
having languageskill = max(languageskill)
然后将其加入到人员表中:

SELECT a.name, b.language
from TableA a
LEFT JOIN
(
  SELECT pid, language, languageskill
  from TableB
  group by pid
  having languageskill = max(languageskill)
) b
ON a.pid = b.pid

当然,如果一个人有一种“并列”的最佳语言,这种方法不会给出超过一行,并且您将丢失关于“并列”的最佳语言的数据。

会有并列吗?如果是,您希望输出什么?很抱歉,在某些版本的SQL中,您可能需要在子select中的select子句中添加'languageskill'