【发布时间】:2012-01-14 23:25:06
【问题描述】:
如果我需要来自 3 个表的数据,是否可以获得 1 个结果。
第一个表:我需要获取所有字段(通过主键找到的 1 行)
第二张表:我需要获取“用户名”字段(通过“master_id”连接到第一张表)
第三张表:我需要使用关联的 master_id 键获取最新添加的行(表有 'date'、'master_id'、'previous_name')。
【问题讨论】:
如果我需要来自 3 个表的数据,是否可以获得 1 个结果。
第一个表:我需要获取所有字段(通过主键找到的 1 行)
第二张表:我需要获取“用户名”字段(通过“master_id”连接到第一张表)
第三张表:我需要使用关联的 master_id 键获取最新添加的行(表有 'date'、'master_id'、'previous_name')。
【问题讨论】:
select top 1 first.*, second.username, third.*
from first
inner join second on first.id = second.master_id
inner join third on first.id = third.master_id
order by
third.date desc
与往常一样,给猫剥皮的方法有很多种,我不确定这是否作为子查询方法进行了优化,但它应该可以工作。
【讨论】:
您可以将三个表连接在一起。然后,您可以使用“过滤器”连接来仅保留最新的 Table3 行:
select *
from Table1 t1
join Table2 t2
on t2.master_id = t1.master_id
join Table3 t3
on t3.master_id = t1.master_id
join (
select master_id
, max(date) as max_date
from Table3
group by
master_id
) as filter
on t3.master_id = filter.master_id
and t3.date = filter.max_date
【讨论】:
您将需要第三个表的相关子查询。
SELECT t1.*, username, date, previous_name
FROM FirstTable t1
INNER JOIN SecondTable t2 ON t1.master_id=t2.master_id
INNER JOIN
(SELECT master_id, date, previous_name
FROM ThirdTable AS t3_1
WHERE date = (
SELECT MAX(date)
FROM ThirdTable AS t3_2
WHERE t3_2.master_id=t3_1.master_id)) q1 ON q1.master_id=t1.master_id;
注意:未经测试。
【讨论】:
master_id 上有索引时。