我的数据库中有两个表,一个包含文件名,另一个包含其中描述的信息记录,包括部分的大小。它可以描述为:
表1:id为整数,name为varchar
表2:recid为整数主键,file_id为整数,得分为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,如果是的话 - 如何使用?
答案 0 :(得分:3)
使用@billkarwin here描述的出色简单技术,实际上可以在没有GROUP BY
的情况下实现:
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 demo。
答案 1 :(得分: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)
答案 2 :(得分: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
);
请注意,您需要表别名来区分内部查询中的表和外部查询。我猜测列实际来自哪些表。