0

我的数据库中有两张表,一张保存文件的名称,另一张保存其中描述的信息记录,包括部分的大小。它可以描述为:

表 1:id 为整数,名称为 varchar

表2:recid为整数主键,file_id为整数,score为float

表之间有一个一对多的链接,从 Table1.id 到 table2.file_id。我需要的是对于名称与特定模式匹配的每个文件,检索具有最高分数的链接记录的 id 和分数本身。到目前为止,我已经使用过:

SELECT name,MAX(score)
FROM Table1
LEFT OUTER JOIN Table2 ON Table2.file_id=Table1.id
WHERE name LIKE :pattern
GROUP BY name

但我无法以这种方式检索 Table2 中记录的 id。

我使用的方言是 Sqlite。

应该使用什么查询来检索对每个文件具有最高分数的记录上的数据?

更新:

通过这个查询,我越来越接近我想要的:

SELECT name,score,recid
FROM Table1
LEFT OUTER JOIN Table2 ON file_id=id 
WHERE name LIKE :pattern
GROUP BY name 
HAVING score=MAX(score)

但是,这会忽略第一个表中在第二个表中没有对应条目的条目。无论如何,我如何确保它们是最终结果?我应该使用 UNION,如果是,如何使用?

4

3 回答 3

3

这实际上可以GROUP BY通过使用@billkarwin在这里描述的非常简单的技术来实现:

SELECT name, t2.score
FROM Table1 t1
LEFT OUTER JOIN Table2 t2 ON t2.file_id = t1.id
LEFT OUTER JOIN Table2 t2copy ON t2copy.file_id = t2.file_id
                             AND t2.score < t2copy.score
WHERE name LIKE :pattern
  AND t2copy.score IS NULL

请参阅SQL Fiddle 演示

于 2013-08-12T10:25:20.600 回答
1

我认为您必须使用子查询

SELECT name, recid, score
FROM Table1
LEFT OUTER JOIN Table2 ON Table2.file_id=Table1.id
WHERE name LIKE :pattern AND score = (SELECT MAX(score) FROM Table2.score)
于 2013-08-12T10:26:16.050 回答
0

我认为最简单的方法是使用相关子查询:

SELECT name, recid, score
FROM Table1 LEFT OUTER JOIN
     Table2
     ON Table2.file_id=Table1.id
WHERE name LIKE :pattern AND
      score = (SELECT MAX(t2.score)
               FROM Table1 t1 LEFT OUTER JOIN
                    Table2 t2 
                    ON t2.file_id=t1.id
               where t1.name = table1.name
              );

请注意,您需要表别名来区分内部查询中的表和外部查询。我猜这些列实际上来自哪些表。

于 2013-08-12T11:09:26.143 回答