读书人

请高手赐教!该怎么处理

发布时间: 2013-01-26 13:47:03 作者: rapoo

请高手赐教!
--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


[解决办法]
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
select c.*,t.*
from @TMain c
left join
(
select * from @TSub b where not exists(select 1 from @TSub where MainId=b.mainid and Age>b.age)
)t
on c.mainid=t.MainId
/*
MainId MainName SubId MainId SubName Age
----------- -------------------------------- ----------- ----------- -------------------------------- -----------
1 小明 13 1 小明爷 69
2 小华 22 2 小华妈 88


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 code?123456789101112--SQL--查找所有人及他们当中的一位年龄最大的亲属 select TM.MainId,TM.MainName,M.SubId,M.SubName,M.MaxAge from @TMain TM inner join(select ts.MainId, ts.SubId,ts.……

那就稍微改动一下,

--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

读书人网 >SQL Server

热点推荐