3个表full join

csproj 2009-11-13 08:09:02
tableA tableB tableC
ID name ID area ID career
1 张三 1 北京 2 学生
2 李四 3 上海 3 工人
3 王五 4 天津 5 教师
7 赵六 5 青岛 6 警察
8 孙七 9 成都 7 医生

怎么才能得到以下查询结果:
——————————————————————

key name area career
1 张三 北京 null
2 李四 null 学生
3 王五 上海 工人
4 null 天津 null
5 null 青岛 教师
6 null null 警察
7 赵六 null 医生
8 孙七 null null
9 null 成都 null


select (case
when tableA.ID is not null Then tableA.ID
when tableB.ID is not null Then tableB.ID
else tableC.ID end) AS ID,
name,area,career
from tableA
full outer join tableB on tableA.ID=tableB.ID
full outer join tableC on tableA.ID=tableC.ID
order by ID

得到的为什么会是10条记录,我想要每个ID一条记录,一共9条记录

如果分成两次join结果就是正确的,但是合并成一次该怎么写。
谢谢大家


...全文
629 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
csproj 2009-11-13
  • 打赏
  • 举报
回复
原来是因为ID列式NULL值的问题,导致连接不上,一条记录变成两条记录。
misterliwei谢谢了
csproj 2009-11-13
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 misterliwei 的回复:]
SQL codeSELECTCOALESCE(A.ID, B.ID, C.ID)AS ID,[NAME], AREA, CAREERFROM TA AFULLJOIN TB BON A.ID= B.IDFULLJOIN TC CONISNULL(A.ID, B.ID)= C.ID
[/Quote]

呵呵,这个算是标准答案吧。可惜分都给出去了
misterliwei 2009-11-13
  • 打赏
  • 举报
回复

SELECT COALESCE(A.ID, B.ID, C.ID) AS ID, [NAME], AREA, CAREER
FROM TA A
FULL JOIN TB B
ON A.ID = B.ID
FULL JOIN TC C
ON ISNULL(A.ID, B.ID) = C.ID
gao__910 2009-11-13
  • 打赏
  • 举报
回复
if object_id('[TA]') is not null drop table [TA]
create table [TA]([ID] int,[name] varchar(4))
insert [TA]
select 1,'张三' union all
select 2,'李四' union all
select 3,'王五' union all
select 7,'赵六' union all
select 8,'孙七'

if object_id('[TB]') is not null drop table [TB]
create table [TB]([ID] int,[area] varchar(4))
insert [TB]
select 1,'北京' union all
select 3,'上海' union all
select 4,'天津' union all
select 5,'青岛' union all
select 9,'成都'

if object_id('[TC]') is not null drop table [TC]
create table [TC]([ID] int,[career] varchar(4))
insert [TC]
select 2,'学生' union all
select 3,'工人' union all
select 5,'教师' union all
select 6,'警察' union all
select 7,'医生'

create view td
as
select id = isnull([ta].id,isnull([tb].id,[tc].id))
from [ta]
full join [tb]
on [ta].id = [tb].id
full join [tc]
on [tb].id = [tc].id
group by isnull([ta].id,isnull([tb].id,[tc].id))

select td.id ,[name],area,career
from td
full join [ta]
on td.id = [ta].id
full join [tb]
on td.id = [tb].id
full join [tc]
on td.id = [tc].id
csproj 2009-11-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sinpoal 的回复:]
SQL code-->sinpoal--->建表ifobject_id('[TA]')isnotnulldroptable[TA]createtable[TA]([ID]int,[name]varchar(4))insert[TA]select1,'张三'unionallselect2,'李四'unionallselect3,'王五'unionallselect7,'赵六'unionallsele?-
[/Quote]
恩,我一楼说了分两步join就可以。
想一步实现,没想到反而更麻烦。
还是分开执行好,呵呵。
ws_hgo 2009-11-13
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 jiabiao113 的回复:]
引用 10 楼 ws_hgo 的回复:
偶的方法貌似有点麻烦


呵呵 得到结果就是好方法
[/Quote]

虽然有点麻烦
但是也很哈理解的
呵呵
csproj 2009-11-13
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 ws_hgo 的回复:]
偶的方法貌似有点麻烦

[/Quote]
呵呵 得到结果就是好方法
csproj 2009-11-13
  • 打赏
  • 举报
回复
jiangshun 谢谢!
ws_hgo 2009-11-13
  • 打赏
  • 举报
回复
偶的方法貌似有点麻烦
ws_hgo 2009-11-13
  • 打赏
  • 举报
回复
偶的可是新方法
create table tableA
(
ID int,
name varchar(20)
)
insert into tableA select 1,'张三'
insert into tableA select 2,'李四'
insert into tableA select 3,'王五'
insert into tableA select 7,'赵六'
insert into tableA select 8,'孙七'


create table tableB
(
ID int,
area varchar(20)
)
insert into tableB select 1,'北京'
insert into tableB select 3,'上海'
insert into tableB select 4,'天津'
insert into tableB select 5,'青岛'
insert into tableB select 9,'成都'

create table tableC
(
ID int,
career varchar(20)
)
insert into tableC select 2,'学生'
insert into tableC select 3,'工人'
insert into tableC select 5,'教师'
insert into tableC select 6,'警察'
insert into tableC select 7,'医生'

;with hgo as
(
select p.number AS ID,A.name from tableA A
right join
(
select number from master..spt_values where type='p'
) p on p.number=A.ID where number<=
(select max(ID)
from
(
select A.ID from tableA A
union all
select B.ID from tableB B
union all
select C.ID from tableC C
) tt) and number>0
)
select h.*,B.area,C.career from hgo h left join tableB B
on h.ID=B.ID left join tableC C
on C.ID=h.ID
ID name area career
----------- -------------------- -------------------- --------------------
1 张三 北京 NULL
2 李四 NULL 学生
3 王五 上海 工人
4 NULL 天津 NULL
5 NULL 青岛 教师
6 NULL NULL 警察
7 赵六 NULL 医生
8 孙七 NULL NULL
9 NULL 成都 NULL
sinpoal 2009-11-13
  • 打赏
  • 举报
回复

-->sinpoal


--->建表
if object_id('[TA]') is not null drop table [TA]
create table [TA]([ID] int,[name] varchar(4))
insert [TA]
select 1,'张三' union all
select 2,'李四' union all
select 3,'王五' union all
select 7,'赵六' union all
select 8,'孙七'

if object_id('[TB]') is not null drop table [TB]
create table [TB]([ID] int,[area] varchar(4))
insert [TB]
select 1,'北京' union all
select 3,'上海' union all
select 4,'天津' union all
select 5,'青岛' union all
select 9,'成都'

if object_id('[TC]') is not null drop table [TC]
create table [TC]([ID] int,[career] varchar(4))
insert [TC]
select 2,'学生' union all
select 3,'工人' union all
select 5,'教师' union all
select 6,'警察' union all
select 7,'医生'


-------------SQL 查询
select ta.* ,tb.area into table1 from ta full join tb
on ta.id=tb.id
select table1.*,tc.career from table1 full join tc
on table2.id=tc.id
-------- 执行
/*
1 张三 北京 NULL
2 李四 NULL 学生
3 王五 上海 工人
7 赵六 NULL 医生
8 孙七 NULL NULL
NULL NULL 天津 NULL
NULL NULL 青岛 NULL
NULL NULL 成都 NULL*/

--小F-- 2009-11-13
  • 打赏
  • 举报
回复
你的10条 没看见我就是抄袭的你的吗?
SQL77 2009-11-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jiabiao113 的回复:]
这个是数据,查询得到11条记录
SQL codeCREATETABLE[TableA]([ID][int],[name][nchar](10) )ON[PRIMARY]CREATETABLE[TableB]([ID][int],[area][nchar](10))ON[PRIMARY]CREATETABLE[TableC]([ID][int],[career][nchar](10) )ON[PRIMARY]INSERTINTO[TableA]VALUES (1,'张三')INSERTINTO[TableA]VALUES (2,'李四')INSERTINTO[TableA]VALUES (3,'王五')INSERTINTO[TableA]VALUES (7,'赵六')INSERTINTO[TableA]VALUES (8,'孙七')INSERTINTO[TableB]VALUES (1,'北京')INSERTINTO[TableB]VALUES (3,'上海')INSERTINTO[TableB]VALUES (4,'天津')INSERTINTO[TableB]VALUES (5,'青岛')INSERTINTO[TableB]VALUES (6,'成都')INSERTINTO[TableC]VALUES (2,'学生')INSERTINTO[TableC]VALUES (3,'工人')INSERTINTO[TableC]VALUES (5,'教师')INSERTINTO[TableC]VALUES (6,'警察')INSERTINTO[TableC]VALUES (7,'医生')select (casewhen tableA.IDisnotnullThen tableA.IDwhen tableB.IDisnotnullThen tableB.IDelse tableC.IDend)AS ID,
name,area,careerfrom tableAfullouterjoin tableBon tableA.ID=tableB.IDfullouterjoin tableCon tableA.ID=tableC.IDorderby ID
[/Quote]
我的呢,
--小F-- 2009-11-13
  • 打赏
  • 举报
回复
CREATE TABLE [TableA]([ID] [int],    [name] [nchar](10) ) ON [PRIMARY]
CREATE TABLE [TableB]([ID] [int], [area] [nchar](10)) ON [PRIMARY]
CREATE TABLE [TableC]([ID] [int], [career] [nchar](10) ) ON [PRIMARY]

INSERT INTO [TableA] VALUES (1,'张三')
INSERT INTO [TableA] VALUES (2,'李四')
INSERT INTO [TableA] VALUES (3,'王五')
INSERT INTO [TableA] VALUES (7,'赵六')
INSERT INTO [TableA] VALUES (8,'孙七')
INSERT INTO [TableB] VALUES (1,'北京')
INSERT INTO [TableB] VALUES (3,'上海')
INSERT INTO [TableB] VALUES (4,'天津')
INSERT INTO [TableB] VALUES (5,'青岛')
INSERT INTO [TableB] VALUES (6,'成都')
INSERT INTO [TableC] VALUES (2,'学生')
INSERT INTO [TableC] VALUES (3,'工人')
INSERT INTO [TableC] VALUES (5,'教师')
INSERT INTO [TableC] VALUES (6,'警察')
INSERT INTO [TableC] VALUES (7,'医生')


SELECT
ISNULL(A.ID,ISNULL(B.ID,C.ID))AS ID ,
A.NAME,B.AREA,C.CAREER
FROM
[TableA] A
FULL JOIN [TableB] B ON
A.ID=B.ID
FULL JOIN [TableC] C ON
A.ID=C.ID
order by 1

drop table [TableA],[Tableb],[Tablec]

/*ID NAME AREA CAREER
----------- ---------- ---------- ----------
1 张三 北京 NULL
2 李四 NULL 学生
3 王五 上海 工人
4 NULL 天津 NULL
5 NULL 青岛 NULL
5 NULL NULL 教师
6 NULL NULL 警察
6 NULL 成都 NULL
7 赵六 NULL 医生
8 孙七 NULL NULL

(10 行受影响)
*/
csproj 2009-11-13
  • 打赏
  • 举报
回复
这个是数据,查询得到11条记录

CREATE TABLE [TableA]([ID] [int], [name] [nchar](10) ) ON [PRIMARY]
CREATE TABLE [TableB]([ID] [int], [area] [nchar](10)) ON [PRIMARY]
CREATE TABLE [TableC]([ID] [int], [career] [nchar](10) ) ON [PRIMARY]

INSERT INTO [TableA] VALUES (1,'张三')
INSERT INTO [TableA] VALUES (2,'李四')
INSERT INTO [TableA] VALUES (3,'王五')
INSERT INTO [TableA] VALUES (7,'赵六')
INSERT INTO [TableA] VALUES (8,'孙七')
INSERT INTO [TableB] VALUES (1,'北京')
INSERT INTO [TableB] VALUES (3,'上海')
INSERT INTO [TableB] VALUES (4,'天津')
INSERT INTO [TableB] VALUES (5,'青岛')
INSERT INTO [TableB] VALUES (6,'成都')
INSERT INTO [TableC] VALUES (2,'学生')
INSERT INTO [TableC] VALUES (3,'工人')
INSERT INTO [TableC] VALUES (5,'教师')
INSERT INTO [TableC] VALUES (6,'警察')
INSERT INTO [TableC] VALUES (7,'医生')

select (case
when tableA.ID is not null Then tableA.ID
when tableB.ID is not null Then tableB.ID
else tableC.ID end) AS ID,
name,area,career
from tableA
full outer join tableB on tableA.ID=tableB.ID
full outer join tableC on tableA.ID=tableC.ID
order by ID
jiangshun 2009-11-13
  • 打赏
  • 举报
回复


--> 测试数据:[TA]
if object_id('[TA]') is not null drop table [TA]
create table [TA]([ID] int,[name] varchar(4))
insert [TA]
select 1,'张三' union all
select 2,'李四' union all
select 3,'王五' union all
select 7,'赵六' union all
select 8,'孙七'

if object_id('[TB]') is not null drop table [TB]
create table [TB]([ID] int,[area] varchar(4))
insert [TB]
select 1,'北京' union all
select 3,'上海' union all
select 4,'天津' union all
select 5,'青岛' union all
select 9,'成都'

if object_id('[TC]') is not null drop table [TC]
create table [TC]([ID] int,[career] varchar(4))
insert [TC]
select 2,'学生' union all
select 3,'工人' union all
select 5,'教师' union all
select 6,'警察' union all
select 7,'医生'

select ID=isnull(TA.ID,isnull(TB.ID,TC.ID)),
[name]=max(name),
[area]=max(area),
[career]=max(career)
from [TA] full join TB on TA.ID=TB.ID full join TC ON TB.ID=TC.ID
group by isnull(TA.ID,isnull(TB.ID,TC.ID))

/*
ID name area career
----------- ---- ---- ------
1 张三 北京 NULL
2 李四 NULL 学生
3 王五 上海 工人
4 NULL 天津 NULL
5 NULL 青岛 教师
6 NULL NULL 警察
7 赵六 NULL 医生
8 孙七 NULL NULL
9 NULL 成都 NULL

*/


drop table TA,TB,TC

SQL77 2009-11-13
  • 打赏
  • 举报
回复
SELECT 
ISNULL(A.ID,ISNULL(B.ID,C.ID))AS ID ,
A.NAME,B.AREA,C.CAREER
FROM A FULL JOIN B ON A.ID=B.ID FULL JOIN C ON A.ID=C.ID
ws_hgo 2009-11-13
  • 打赏
  • 举报
回复
tableA tableB tableC
ID name ID area ID career

select A.ID,A.name,B.area,C.career from tableA A left join table B on
A.ID=B.ID join tableC C on A.ID=C.ID

34,588

社区成员

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

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