请高手赐教!
--4. 查找所有人及他们当中的一位年龄最大的亲属
这个操作, 突然有点思维短路,虽然得到了结果, 但不全面,没有亲属的名称和SubId,想不出好的办法, 请高手赐教!
DECLARE @TMain TABLE(MainId INT, MainName VARCHAR(32))
DECLARE @TSub TABLE(SubId INT, MainId INT, SubName VARCHAR(32), Age INT)
INSERT INTO @TMain
SELECT 1,'小明' UNION
SELECT 2,'小华' UNION
SELECT 3,'小鸟'
INSERT INTO @TSub
SELECT 11,1,'小明爸',48 UNION
SELECT 12,1,'小明妈',47 UNION
SELECT 13,1,'小明爷',69 UNION
SELECT 22,2,'小华妈',88 UNION
SELECT 23,2,'小华姐',32
--1. 查找每个有亲属的人及亲属
SELECT *
FROM @TMain a
INNER JOIN @TSub b
ON a.MainId = b.MainId
--2. 查找每个有亲属的人
SELECT *
FROM @TMain a
WHERE a.MainId IN (SELECT t.MainId
FROM @TSub t)
--3. 查找所有人及亲属
SELECT *
FROM @TMain a
LEFT JOIN @TSub b
ON a.MainId = b.MainId
--4. 查找所有人及他们当中的一位年龄最大的亲属
SELECT c.*,
t.age
FROM @TMain c
LEFT JOIN
(
SELECT b.MainId,
MAX(b.Age) AS Age,
FROM @TSub b
GROUP BY
b.MainId
) AS t
ON c.MainId = t.MainId
DECLARE @TMain TABLE(MainId INT, MainName VARCHAR(32))
DECLARE @TSub TABLE(SubId INT, MainId INT, SubName VARCHAR(32), Age INT)
INSERT INTO @TMain
SELECT 1,'小明' UNION
SELECT 2,'小华' UNION
SELECT 3,'小鸟'
INSERT INTO @TSub
SELECT 11,1,'小明爸',48 UNION
SELECT 12,1,'小明妈',47 UNION
SELECT 13,1,'小明爷',69 UNION
SELECT 22,2,'小华妈',88 UNION
SELECT 23,2,'小华姐',32
--1. 查找每个有亲属的人及亲属
SELECT *
FROM @TMain a
INNER JOIN @TSub b
ON a.MainId = b.MainId
--2. 查找每个有亲属的人
SELECT *
FROM @TMain a
WHERE a.MainId IN (SELECT t.MainId
FROM @TSub t)
--3. 查找所有人及亲属
SELECT *
FROM @TMain a
LEFT JOIN @TSub b
ON a.MainId = b.MainId
--4. 查找所有人及他们当中的一位年龄最大的亲属
SELECT *
FROM @TMain c
outer apply
(
SELECT top(1)*
FROM @TSub b where c.MainId = b.MainId
order by Age desc
) AS t
3 小鸟 NULL NULL NULL NULL
(3 行受影响)
*/
[解决办法]
没有就加咯
DECLARE @TMain TABLE(MainId INT, MainName VARCHAR(32))
DECLARE @TSub TABLE(SubId INT, MainId INT, SubName VARCHAR(32), Age INT)
INSERT INTO @TMain
SELECT 1,'小明' UNION
SELECT 2,'小华' UNION
SELECT 3,'小鸟'
INSERT INTO @TSub
SELECT 11,1,'小明爸',48 UNION
SELECT 12,1,'小明妈',47 UNION
SELECT 13,1,'小明爷',69 UNION
SELECT 22,2,'小华妈',88 UNION
SELECT 23,2,'小华姐',32
--4. 查找所有人及他们当中的一位年龄最大的亲属
SELECT c.* ,
t.age ,
SubName ,
subid
FROM @TMain c
LEFT JOIN ( SELECT b.MainId ,
MAX(b.Age) AS Age ,
b.SubName ,
b.subid
FROM @TSub b
GROUP BY b.MainId ,
b.SubName ,
b.subid
) AS t ON c.MainId = t.MainId
/*
MainId MainName age SubName subid
----------- -------------------------------- ----------- -------------------------------- -----------
1 小明 48 小明爸 11
1 小明 47 小明妈 12
1 小明 69 小明爷 13
2 小华 32 小华姐 23
2 小华 88 小华妈 22
3 小鸟 NULL NULL NULL
(6 行受影响)
*/
--SQL
--查找所有人及他们当中的一位年龄最大的亲属
select TM.MainId,TM.MainName,M.SubId,M.SubName,M.MaxAge from @TMain TM left join(
select ts.MainId, ts.SubId,ts.SubName,r.MaxAge from @TSub TS inner join(
select MainId,MAX(Age) MaxAge From @TSub group by MainId ) R
on TS.MainId=r.MainId and TS.Age=r.MaxAge) M
on TM.MainId=M.MainId
--结果集合
--1小明13小明爷69
--2小华22小华妈88
--3小鸟NULLNULLNULL