关于多表合并连接查询,如何去掉重复的结果?

rideyou 2007-11-13 09:30:22
例如:
表A
ih hc date
1 Q1 2007-1-1
1 Q1 2007-2-1
2 Q2 2007-1-5
3 Q3 2007-3-1

表B
ih idx jg
1 1 10.2
1 2 10.3
1 3 9.8
2 1 11
2 2 10.2
3 2 12

想要的结果:
ih hc date jg
1 Q1 2007-1-1 10.2
2007-2-1 10.3
9.8
2 Q2 2007-1-5 11
10.2
3 Q3 2007-3-1 12

如何实现?谢谢,在线等!
...全文
174 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
rideyou 2007-11-13
  • 打赏
  • 举报
回复
谢谢各位,我先把这个帖子结了,我把实际的表结构及数据发到另一个贴子里,希望大家帮忙分析解决!
samfeng_2003 2007-11-13
  • 打赏
  • 举报
回复

--少了个条件

SELECT ih= CASE WHEN B.ID >= 2 THEN '' ELSE CAST(A.ih AS VARCHAR) END
,hc=CASE WHEN B.ID >= 2 THEN '' ELSE ISNULL(A.hc,'') END,
DATE = CASE WHEN
(SELECT DATE FROM
(
SELECT ID = (SELECT COUNT(1) FROM T1 WHERE A.ih = ih AND date<=a.date),*
FROM T1 A
) M
WHERE M.ID-1 = A.ID AND A.ih = M.ih ) = A.DATE
THEN ''
ELSE ISNULL(A.DATE,'')
END,
B.jg
FROM
(
SELECT ID = (SELECT COUNT(1) FROM T1 WHERE A.ih = ih AND date<=a.date),*
FROM T1 A
) A
RIGHT JOIN
(
SELECT ID = (SELECT COUNT(1) FROM T2 WHERE A.ih = ih AND idx<=a.idx),*
FROM T2 A
) B ON A.ID = B.ID AND A.ih = B.ih


samfeng_2003 2007-11-13
  • 打赏
  • 举报
回复


CREATE TABLE T1
(
ih INT,
hc VARCHAR(20),
date VARCHAR(20)
)

INSERT INTO T1
SELECT 1,'Q1','2007-1-1' UNION ALL
SELECT 1,'Q1','2007-2-1' UNION ALL
SELECT 2,'Q2','2007-1-5' UNION ALL
SELECT 3,'Q3','2007-3-1'

CREATE TABLE T2
(ih INT,
idx INT,
jg DECIMAL(10,2)
)
INSERT INTO T2
SELECT 1,1,10.2 UNION ALL
SELECT 1,2,10.3 UNION ALL
SELECT 1,3,9.8 UNION ALL
SELECT 2,1,11 UNION ALL
SELECT 2,2,10.2 UNION ALL
SELECT 3,2,12

SELECT ih= CASE WHEN B.ID >= 2 THEN '' ELSE CAST(A.ih AS VARCHAR) END
,hc=CASE WHEN B.ID >= 2 THEN '' ELSE ISNULL(A.hc,'') END,
DATE = CASE WHEN
(SELECT DATE FROM
(
SELECT ID = (SELECT COUNT(1) FROM T1 WHERE A.ih = ih AND date<=a.date),*
FROM T1 A
) M
WHERE M.ID-1 = A.ID) = A.DATE
THEN ''
ELSE ISNULL(A.DATE,'')
END,
B.jg
FROM
(
SELECT ID = (SELECT COUNT(1) FROM T1 WHERE A.ih = ih AND date<=a.date),*
FROM T1 A
) A
RIGHT JOIN
(
SELECT ID = (SELECT COUNT(1) FROM T2 WHERE A.ih = ih AND idx<=a.idx),*
FROM T2 A
) B ON A.ID = B.ID AND A.ih = B.ih


DROP TABLE T1,T2

ih hc DATE jg
------------------------------ -------------------- -------------------- ------------
1 Q1 2007-1-1 10.20
2007-2-1 10.30
9.80
2 Q2 2007-1-5 11.00
10.20
3 Q3 2007-3-1 12.00

(所影响的行数为 6 行)
dawugui 2007-11-13
  • 打赏
  • 举报
回复
create table A(ih int,hc varchar(10),date datetime)
insert into A values(1, 'Q1', '2007-1-1')
insert into A values(1, 'Q1', '2007-2-1')
insert into A values(2, 'Q2', '2007-1-5')
insert into A values(3, 'Q3', '2007-3-1')
create table B(ih int,idx int,jg decimal(18,1))
insert into B values(1, 1, 10.2)
insert into B values(1, 2, 10.3)
insert into B values(1, 3, 9.8 )
insert into B values(2, 1, 11 )
insert into B values(2, 2, 10.2)
insert into B values(3, 2, 12 )
go

select
ih = case when idx=(select min(idx) from
(
select t1.* , b.idx,b.jg from (select t.* from a t where date = (select min(date) from a where ih = t.ih)) t1,b where t1.ih = b.ih
) m1
where m4.ih=m1.ih) then cast(ih as varchar) else '' end ,
hc = case when idx=(select min(idx) from
(
select t1.* , b.idx,b.jg from (select t.* from a t where date = (select min(date) from a where ih = t.ih)) t1,b where t1.ih = b.ih
) m2
where m4.ih=m2.ih) then hc else '' end ,
date = case when idx=(select min(idx) from
(
select t1.* , b.idx,b.jg from (select t.* from a t where date = (select min(date) from a where ih = t.ih)) t1,b where t1.ih = b.ih
) m3
where m4.ih=m3.ih) then convert(varchar(10),date,120) else '' end ,
jg
from
(
select t1.* , b.idx,b.jg from (select t.* from a t where date = (select min(date) from a where ih = t.ih)) t1,b where t1.ih = b.ih
) m4

drop table A,B

/*
ih hc date jg
------------------------------ ---------- ---------- --------------------
1 Q1 2007-01-01 10.2
10.3
9.8
2 Q2 2007-01-05 11.0
10.2
3 Q3 2007-03-01 12.0

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

dawugui 2007-11-13
  • 打赏
  • 举报
回复
create table A(ih varchar(10),hc varchar(10),date varchar(10))
insert into A values('1', 'Q1', '2007-01-01')
insert into A values('1', 'Q1', '2007-02-01')
insert into A values('2', 'Q2', '2007-01-05')
insert into A values('3', 'Q3', '2007-03-01')
create table B(ih varchar(10),idx int,jg decimal(18,1))
insert into B values('1', 1, 10.2)
insert into B values('1', 2, 10.3)
insert into B values('1', 3, 9.8 )
insert into B values('2', 1, 11 )
insert into B values('2', 2, 10.2)
insert into B values('3', 2, 12 )
go

select
ih = case when idx=(select min(idx) from
(
select t1.* , b.idx,b.jg from (select t.* from a t where date = (select min(date) from a where ih = t.ih)) t1,b where t1.ih = b.ih
) m1
where m4.ih=m1.ih) then ih else '' end ,
hc = case when idx=(select min(idx) from
(
select t1.* , b.idx,b.jg from (select t.* from a t where date = (select min(date) from a where ih = t.ih)) t1,b where t1.ih = b.ih
) m2
where m4.ih=m2.ih) then hc else '' end ,
date = case when idx=(select min(idx) from
(
select t1.* , b.idx,b.jg from (select t.* from a t where date = (select min(date) from a where ih = t.ih)) t1,b where t1.ih = b.ih
) m3
where m4.ih=m3.ih) then date else '' end ,
jg
from
(
select t1.* , b.idx,b.jg from (select t.* from a t where date = (select min(date) from a where ih = t.ih)) t1,b where t1.ih = b.ih
) m4

drop table A,B

/*
ih hc date jg
---------- ---------- ---------- --------------------
1 Q1 2007-01-01 10.2
10.3
9.8
2 Q2 2007-01-05 11.0
10.2
3 Q3 2007-03-01 12.0

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

samfeng_2003 2007-11-13
  • 打赏
  • 举报
回复

CREATE TABLE T1
(
ih INT,
hc VARCHAR(20),
date VARCHAR(20)
)

INSERT INTO T1
SELECT 1,'Q1','2007-1-1' UNION ALL
SELECT 1,'Q1','2007-2-1' UNION ALL
SELECT 2,'Q2','2007-1-5' UNION ALL
SELECT 3,'Q3','2007-3-1'

CREATE TABLE T2
(ih INT,
idx INT,
jg DECIMAL(10,2)
)
INSERT INTO T2
SELECT 1,1,10.2 UNION ALL
SELECT 1,2,10.3 UNION ALL
SELECT 1,3,9.8 UNION ALL
SELECT 2,1,11 UNION ALL
SELECT 2,2,10.2 UNION ALL
SELECT 3,2,12

SELECT A.ih,A.hc,A.date,B.jg
FROM
(
SELECT ID = (SELECT COUNT(1) FROM T1 WHERE A.ih = ih AND date<=a.date),*
FROM T1 A
) A
RIGHT JOIN
(
SELECT ID = (SELECT COUNT(1) FROM T2 WHERE A.ih = ih AND idx<=a.idx),*
FROM T2 A
) B ON A.ID = B.ID AND A.ih = B.ih


DROP TABLE T1,T2

ih hc date jg
----------- -------------------- -------------------- ------------
1 Q1 2007-1-1 10.20
1 Q1 2007-2-1 10.30
NULL NULL NULL 9.80
2 Q2 2007-1-5 11.00
NULL NULL NULL 10.20
3 Q3 2007-3-1 12.00

(所影响的行数为 6 行)

fcuandy 2007-11-13
  • 打赏
  • 举报
回复
要求不明确。
ta中ih=1的2条记录,tb中ih=1的记录3条,join 出来6条。
idx=1的tb行与ih=1的ta的首行对应,
ih=1的tb行的其它行就与ih=1的第二行对应呢?
如果将这看成规定也可以,
那tb的idx=1的行对应到ta中同ih的首行,
其它行对应到ta中同ih的第二行。

那么ta中同ih的行有三行呢?又怎么取?

逻辑不明,不做回答
yrwx001 2007-11-13
  • 打赏
  • 举报
回复
select isnull(A.ih,''),isnull(A.hc,''),isnull(A.date,''),B.jg
from B left join A on B.ih = A.ih and B.idx = month(A.date)
dobear_0922 2007-11-13
  • 打赏
  • 举报
回复
晕,看错了
dobear_0922 2007-11-13
  • 打赏
  • 举报
回复
select A.*, B.jg
from A left join (select ih, jg=min(jg) from B group by ih) B
on A.ih=B.ih

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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