高分求以下存储过程写法,50分!!

mint 2010-03-07 09:28:21
高分求以下存储过程写法:
现有表A 和B
表 A:

ID Name
1 张三
2 李四
表B,其中A的ID是B 中AID的外键
ID AID path
1 1 图片一
1 2 图片二
1 1 图片三

求一个存储过程,返回这样的数据集。

ID Name path
1 张三 图片一
2 李四 图片二

其结果中,由于A与B是一多关系,所以只取B中的 对应A 的第一条记录top1组合。请问这样的存储过程如何写?
...全文
105 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ShenLiang2025 2010-03-07
  • 打赏
  • 举报
回复
Hi,
Found something ...





0)表和新的测试数据

IF OBJECT_ID('[ta]') IS NOT NULL
DROP TABLE [ta]
Go
CREATE TABLE ta([ID] INT,[Name] NVARCHAR(2))
Go
INSERT INTO ta
SELECT 1,'张三' UNION ALL
SELECT 2,'李四'
GO
-- Test Data: tb
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
Go
----tb new data 这里MAX(PATH)为图片一,MIN(PATH)为图片二
CREATE TABLE tb([ID] INT,[AID] INT,[path] NVARCHAR(3))
Go
INSERT INTO tb
SELECT 1,1,'图片一' UNION ALL
SELECT 1,2,'图片二' UNION ALL
SELECT 1,1,'图片三'
GO

1)查询1
SELECT ID = ta.id ,NAME,PATH
FROM ta
INNER JOIN
(SELECT *,RANK = ROW_NUMBER()OVER(PARTITION BY AID,id ORDER BY GETDATE())FROM tb)B
ON ta.id = B.Aid
WHERE B.RANK = 1

1.1)结果

ID NAME PATH
----------- ---- ----
1 张三 图片一
2 李四 图片二

(2 row(s) affected)

--SET STATISTICS PROFILE OFF

2)查询2
select ta.*,tb.path from ta,tb where ta.id=tb.aid and
not exists(select 1 from tb t where t.aid=tb.aid and t.path<tb.path)


2.1)结果

ID Name path
----------- ---- ----
1 张三 图片三
2 李四 图片二

(2 row(s) affected)

3)同理修改tb数据,再测试 ...


ShenLiang2025 2010-03-07
  • 打赏
  • 举报
回复
Hi,
Study Getdate() Way.



0)表和数据

IF OBJECT_ID('[ta]') IS NOT NULL
DROP TABLE [ta]
Go
CREATE TABLE ta([ID] INT,[Name] NVARCHAR(2))
Go
INSERT INTO ta
SELECT 1,'张三' UNION ALL
SELECT 2,'李四'
GO
-- Test Data: tb
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
Go
CREATE TABLE tb([ID] INT,[AID] INT,[path] NVARCHAR(3))
Go
INSERT INTO tb
SELECT 1,1,'图片零' UNION ALL
SELECT 1,2,'图片二' UNION ALL
SELECT 1,1,'图片一'
GO



1)查询
SELECT ID = ta.id ,NAME,PATH
FROM ta
INNER JOIN
(SELECT *,RANK = ROW_NUMBER()OVER(PARTITION BY AID,id ORDER BY GETDATE())FROM tb)B
ON ta.id = B.Aid
WHERE B.RANK = 1

2)结果
ID NAME PATH
----------- ---- ----
1 张三 图片零
2 李四 图片二

(2 row(s) affected)


victorcai2006 2010-03-07
  • 打赏
  • 举报
回复
同样LZ还需要知道如何达到的这个效果,在联机丛书里面搜索EXISTS关键字,

----------------------------------
使用 EXISTS 和 NOT EXISTS 查找交集与差集
使用 EXISTS 和 NOT EXISTS 引入的子查询可用于两种集合原理的操作:交集与差集。两个集合的交集包含同时属于两个原集合的所有元素。差集包含只属于两个集合中的第一个集合的元素。

city 列中 authors 和 publishers 的交集是作者和出版商共同居住的城市的集合。

USE pubs
SELECT DISTINCT city
FROM authors
WHERE EXISTS
(SELECT *
FROM publishers
WHERE authors.city = publishers.city)

下面是结果集:

city
--------
Berkeley

(1 row(s) affected)

当然,该查询可以写成一个简单的联接。

USE pubs
SELECT DISTINCT authors.city
FROM authors INNER JOIN publishers
ON authors.city = publishers.city

city 列中 authors 和 publishers 的差集是作者所居住的、但没有出版商居住的所有城市的集合,也就是除 Berkeley 以外的所有城市。

USE pubs
SELECT DISTINCT city
FROM authors
WHERE NOT EXISTS
(SELECT *
FROM publishers
WHERE authors.city = publishers.city)

该查询也可以写成:

USE pubs
SELECT DISTINCT city
FROM authors
WHERE city NOT IN
(SELECT city
FROM publishers)
victorcai2006 2010-03-07
  • 打赏
  • 举报
回复

/*
-----------------------------------------------------------------------
Microsoft SQL Server 2000 - 8.00.194 (Intel X86)
Aug 6 2000 00:57:48
Copyright (c) 1988-2000 Microsoft Corporation
Personal Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
-----------------------------------------------------------------------
瘦狼阿亮 \ 享受学习的乐趣
*/

use tempdb

--建立A变量表
declare @A table (ID smallint,Name varchar(30))

--录入表A测试数据
insert into @A
select 1,'张三' union all
select 2,'李四'
/*执行结果:
(所影响的行数为 2 行)
*/

--查看A表录入的测试数据
select * from @a
/*执行结果:
ID Name
------ ------------------------------
1 张三
2 李四

(所影响的行数为 2 行)
*/

--建立B变量表
declare @B table (ID smallint,AID smallint,Path varchar(30))

--录入表A测试数据
insert into @B
select 1,1,'图片一' union all
select 1,2,'图片二' union all
select 1,1,'图片三'
/*执行结果:
(所影响的行数为 3 行)
*/

--查看B表录入的测试数据
select * from @b
/*执行结果:
ID AID Path
------ ------ ------------------------------
1 1 图片一
1 2 图片二
1 1 图片三

(所影响的行数为 3 行)
*/

---执行相关查询
select
a.id,a.name,b.path
from
@a a,@b b
where
a.id=b.aid and not exists
(select 1 from @b tb where tb.aid=b.aid and tb.Path>b.path)
/*执行结果:
id name path
------ ------------------------------ ------------------------------
1 张三 图片一
2 李四 图片二

(所影响的行数为 2 行)
*/
ws_hgo 2010-03-07
  • 打赏
  • 举报
回复
select a.*,b.path from a,b where a.id=b.aid and 
not exists(select 1 from b t where t.aid=b.aid and t.path<b.path)
--小F-- 2010-03-07
  • 打赏
  • 举报
回复
select
a.*,b.path
from
a,b
where
a.id=b.aid
and
path=(select max(path) from b t where t.aid=b.aid )
-狙击手- 2010-03-07
  • 打赏
  • 举报
回复
------------------------------------------------------------------------
-- Author : happyflystone
-- Date : 2010-03-07
-- Version: Microsoft SQL Server 2005 - 9.00.2047.00 (Intel X86)
-- Apr 14 2006 01:12:25
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
--
------------------------------------------------------------------------

-- Test Data: ta
IF OBJECT_ID('[ta]') IS NOT NULL
DROP TABLE [ta]
Go
CREATE TABLE ta([ID] INT,[Name] NVARCHAR(2))
Go
INSERT INTO ta
SELECT 1,'张三' UNION ALL
SELECT 2,'李四'
GO
-- Test Data: tb
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
Go
CREATE TABLE tb([ID] INT,[AID] INT,[path] NVARCHAR(3))
Go
INSERT INTO tb
SELECT 1,1,'图片一' UNION ALL
SELECT 1,2,'图片二' UNION ALL
SELECT 1,1,'图片三'
GO
--Start
;with cte
as
(select rid = row_number() over(partition by aid order by getdate()),*
from tb )
select a.*,b.path
from ta a left join cte b on a.id = b.aid and b.rid = 1
--Result:
/*
ID Name path
----------- ---- ----
1 张三 图片一
2 李四 图片二

(2 行受影响)

*/
--End
-狙击手- 2010-03-07
  • 打赏
  • 举报
回复
;with cte
as
(select rid = row_number() over(partition by aid order by getdate()),*
from tb )
select a.*,b.path
from ta a left join cte b on a.id = b.aid and b.rid = 1
  • 打赏
  • 举报
回复

select id,name,path
from (select row=row_number()over(order by getdate()),tba.id.name.path
from tba join tbb on tba.id=tbb.aid)K
where row=1
pt1314917 2010-03-07
  • 打赏
  • 举报
回复

select a.*,b.path from a,b
where a.id=b.aid and
not exists(select 1 from b t where t.aid=b.aid and t.path<b.path)

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧