2表一对多的关系,如何联结查询。。。

时间:2022-10-25 22:34:10
2表一对多的关系,如何联结查询。。。
有2表
    A表
    事件ID       事件内容 
     xg001        事件1  
    xg002        事件2 
 
     B表 
    事件ID     每周进展情况
     xg001     第1周打扫
     xg002     第1周开始
     xg001     第2周整理
     xg001     第3周完成


想查询出,每个事件最新的发展情况  如下结果:

    事件ID      事件内容          每周进展情况(最新)
     xg001        事件1            第3周完成
     xg002        事件2            第1周开始

10 个解决方案

#1


B表应该有一个ID或者时间来表示该行记录是最新的记录

#2


with tabs as
(
select a.事件ID,row_number() over(partition by a.事件ID order by a.事件ID)rn, 事件内容,每周进展情况  from a,b where a.事件ID=b.事件ID
)
select 事件ID, 事件内容,每周进展情况 from  tabs p  
where p.rn in (
select max(rn)  from tabs t  where p.事件ID=t.事件ID group by 事件ID
)


最好给B表加个id自增主键,那样查询就简单多了

#3



select a.事件ID,a.事件内容,b.每周进展情况
from A表 a
inner join 
(select row_number() over(partition by 事件ID order by getdate()) 'rn',  
 事件ID,每周进展情况 from B表 b
on a.事件ID=b.事件ID and b.rn=1

#4


该回复于2012-11-04 14:00:35被版主删除

#5


那就在B表 增加1列
       
    事件ID     周数   每周进展情况
     xg001     1      第1周打扫
     xg002     1      第1周开始
     xg001     2      第2周整理
     xg001     3      第3周完成

想查询出,每个事件最新的发展情况  如下结果:

    事件ID      事件内容          每周进展情况(最新)
     xg001        事件1            第3周完成
     xg002        事件2            第1周开始 

#6


偷学楼上各位的,楼主可以试下

if OBJECT_ID('tabb') is not null
drop table tabb
if OBJECT_ID('taba') is not null
drop table taba

go
create table taba(id char(5) not null primary key,content varchar(5))
create table tabb(id char(5) not null,week int,status varchar(10),constraint re_taba foreign key (id) references taba(id))
go
insert into taba
select 'xg001', '事件1' union all
select  'xg002','事件2'
insert into tabb
select 'xg001',1,'第1周打扫' union all
select 'xg002',1,'第1周开始' union all
select 'xg001',2,'第2周整理' union all
select 'xg001',3,'第3周完成'

select a.ID,content,status from taba a join
(select ID,status,ROW_NUMBER() over(PARTITION by id order by week desc) as rn from tabb )
 as b on
 a.id=b.id and b.rn=1
 

#7


2表一对多的关系,如何联结查询。。。

#8



IF (OBJECT_ID('A')IS NOT NULL)DROP TABLE A
GO
CREATE TABLE A
(
[事件ID] VARCHAR(100),
[事件内容]VARCHAR(100)
)
GO
INSERT INTO A
SELECT 'xg001','事件1' UNION ALL
SELECT 'xg002','事件2' 
GO
IF(OBJECT_ID('B')IS NOT NULL)DROP TABLE B
GO
CREATE TABLE B
(
[事件ID] VARCHAR(100),
[每周进展情况] VARCHAR(800)
)
GO
INSERT INTO  B
SELECT 'xg001','第1周打扫' UNION ALL
SELECT 'xg002','第1周开始' UNION ALL
SELECT 'xg001','第2周整理' UNION ALL
SELECT 'xg001','第3周完成'

SELECT A.[事件ID],A.[事件内容],MAX(B.[每周进展情况])as ' 每周进展情况(最新)' 
FROM A INNER JOIN B ON A.[事件ID] =B.[事件ID]
GROUP BY A.[事件ID],A.[事件内容]
/*
事件ID                                                                                                 事件内容                                                                                                  每周进展情况(最新)
---------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
xg001                                                                                                事件1                                                                                                  第3周完成
xg002                                                                                                事件2                                                                                                  第1周开始

(2 行受影响)

*/

#9


select * from a,b
where a.id=b.id

#10


IF (OBJECT_ID('A')IS NOT NULL)DROP TABLE A
GO
CREATE TABLE A
(
[事件ID] VARCHAR(100),
[事件内容]VARCHAR(100)
)
GO
INSERT INTO A
SELECT 'xg001','事件1' UNION ALL
SELECT 'xg002','事件2' 
GO
IF(OBJECT_ID('B')IS NOT NULL)DROP TABLE B
GO
CREATE TABLE B
(
[事件ID] VARCHAR(100),
[每周进展情况] VARCHAR(800)
)
GO
INSERT INTO  B
SELECT 'xg001','第1周打扫' UNION ALL
SELECT 'xg002','第1周开始' UNION ALL
SELECT 'xg001','第2周整理' UNION ALL
SELECT 'xg001','第3周完成'
 
SELECT A.[事件ID],A.[事件内容],MAX(B.[每周进展情况])as ' 每周进展情况(最新)' 
FROM A INNER JOIN B ON A.[事件ID] =B.[事件ID]
GROUP BY A.[事件ID],A.[事件内容]

#1


B表应该有一个ID或者时间来表示该行记录是最新的记录

#2


with tabs as
(
select a.事件ID,row_number() over(partition by a.事件ID order by a.事件ID)rn, 事件内容,每周进展情况  from a,b where a.事件ID=b.事件ID
)
select 事件ID, 事件内容,每周进展情况 from  tabs p  
where p.rn in (
select max(rn)  from tabs t  where p.事件ID=t.事件ID group by 事件ID
)


最好给B表加个id自增主键,那样查询就简单多了

#3



select a.事件ID,a.事件内容,b.每周进展情况
from A表 a
inner join 
(select row_number() over(partition by 事件ID order by getdate()) 'rn',  
 事件ID,每周进展情况 from B表 b
on a.事件ID=b.事件ID and b.rn=1

#4


该回复于2012-11-04 14:00:35被版主删除

#5


那就在B表 增加1列
       
    事件ID     周数   每周进展情况
     xg001     1      第1周打扫
     xg002     1      第1周开始
     xg001     2      第2周整理
     xg001     3      第3周完成

想查询出,每个事件最新的发展情况  如下结果:

    事件ID      事件内容          每周进展情况(最新)
     xg001        事件1            第3周完成
     xg002        事件2            第1周开始 

#6


偷学楼上各位的,楼主可以试下

if OBJECT_ID('tabb') is not null
drop table tabb
if OBJECT_ID('taba') is not null
drop table taba

go
create table taba(id char(5) not null primary key,content varchar(5))
create table tabb(id char(5) not null,week int,status varchar(10),constraint re_taba foreign key (id) references taba(id))
go
insert into taba
select 'xg001', '事件1' union all
select  'xg002','事件2'
insert into tabb
select 'xg001',1,'第1周打扫' union all
select 'xg002',1,'第1周开始' union all
select 'xg001',2,'第2周整理' union all
select 'xg001',3,'第3周完成'

select a.ID,content,status from taba a join
(select ID,status,ROW_NUMBER() over(PARTITION by id order by week desc) as rn from tabb )
 as b on
 a.id=b.id and b.rn=1
 

#7


2表一对多的关系,如何联结查询。。。

#8



IF (OBJECT_ID('A')IS NOT NULL)DROP TABLE A
GO
CREATE TABLE A
(
[事件ID] VARCHAR(100),
[事件内容]VARCHAR(100)
)
GO
INSERT INTO A
SELECT 'xg001','事件1' UNION ALL
SELECT 'xg002','事件2' 
GO
IF(OBJECT_ID('B')IS NOT NULL)DROP TABLE B
GO
CREATE TABLE B
(
[事件ID] VARCHAR(100),
[每周进展情况] VARCHAR(800)
)
GO
INSERT INTO  B
SELECT 'xg001','第1周打扫' UNION ALL
SELECT 'xg002','第1周开始' UNION ALL
SELECT 'xg001','第2周整理' UNION ALL
SELECT 'xg001','第3周完成'

SELECT A.[事件ID],A.[事件内容],MAX(B.[每周进展情况])as ' 每周进展情况(最新)' 
FROM A INNER JOIN B ON A.[事件ID] =B.[事件ID]
GROUP BY A.[事件ID],A.[事件内容]
/*
事件ID                                                                                                 事件内容                                                                                                  每周进展情况(最新)
---------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
xg001                                                                                                事件1                                                                                                  第3周完成
xg002                                                                                                事件2                                                                                                  第1周开始

(2 行受影响)

*/

#9


select * from a,b
where a.id=b.id

#10


IF (OBJECT_ID('A')IS NOT NULL)DROP TABLE A
GO
CREATE TABLE A
(
[事件ID] VARCHAR(100),
[事件内容]VARCHAR(100)
)
GO
INSERT INTO A
SELECT 'xg001','事件1' UNION ALL
SELECT 'xg002','事件2' 
GO
IF(OBJECT_ID('B')IS NOT NULL)DROP TABLE B
GO
CREATE TABLE B
(
[事件ID] VARCHAR(100),
[每周进展情况] VARCHAR(800)
)
GO
INSERT INTO  B
SELECT 'xg001','第1周打扫' UNION ALL
SELECT 'xg002','第1周开始' UNION ALL
SELECT 'xg001','第2周整理' UNION ALL
SELECT 'xg001','第3周完成'
 
SELECT A.[事件ID],A.[事件内容],MAX(B.[每周进展情况])as ' 每周进展情况(最新)' 
FROM A INNER JOIN B ON A.[事件ID] =B.[事件ID]
GROUP BY A.[事件ID],A.[事件内容]