hery2002(苦*行*僧)请进。。

BMadman 2009-12-17 03:03:57
还是刚才3表联合FULL JOIN查询的问题。。
你刚才最后写的SQL语句的是在指导有什么字段的情况下解决的。。如果我不知道有什么字段。指我这3个表的字段可以动态添加。。如果列名一样。。我怎么去掉重复的?
QQ:317926070,真的很感谢你。。这个问题令我很苦恼。。
...全文
235 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
lsd123 2009-12-17
  • 打赏
  • 举报
回复
.
hery2002 2009-12-17
  • 打赏
  • 举报
回复
结了吧,已有答案了.就是动态设定一下而已.
csdyyr 2009-12-17
  • 打赏
  • 举报
回复
create  table t1(a nvarchar(10),b nvarchar(10),c nvarchar(10),d nvarchar(10), id int)
create table t2(a nvarchar(10),e nvarchar(10),f nvarchar(10),id int)
create table t3(b nvarchar(10),c nvarchar(10),g nvarchar(10),h nvarchar(10), id int)

insert t1
select '1','2','3','4',0

insert t2
select '5','6','7',0

insert t3
select '8','9','10','0',0

declare @id int
set @id=0

update t1 set @id=@id+1, id=@id
update t2 set @id=@id+1, id=@id
update t3 set @id=@id+1, id=@id

select t.name as col,object_name(c.id) as tableName
into #
from (
select name
from syscolumns
where object_name(id) in ('t1','t2','t3') and name<>'id'
group by name
having count(*)>1
) t join syscolumns as c on c.name=t.name
where object_name(c.id) in ('t1','t2','t3')


declare @str varchar(8000),@grp int, @str2 varchar(8000),@col varchar(255),@cols varchar(1000)
set @str2=''
set @grp=1
set @cols=''

select @cols=@cols+','+name
from (
select name
from syscolumns
where object_name(id) in ('t1','t2','t3')
group by name
having count(*)=1
) t


select *,grp=(select count(distinct col) from # where col<=t.col)
into #2
from # as t

while exists(select * from #2 where grp=@grp)
begin
set @str=''
select @str=@str+','+tableName+'.'+col,
@col=col
from #2
where grp=@grp

set @str=',COALESCE('+stuff(@str,1,1,'')+') as '+@col
set @str2=@str2+@str
set @grp=@grp+1
end
set @str2=stuff(@str2,1,1,'')

exec('select '+ @str2+@cols+' from t1 full join t2 on t1.id=t2.id full join t3 on t1.id=t3.id')

drop table t1,t2,t3,#,#2
/*
a b c d e f g h
---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
1 2 3 4 NULL NULL NULL NULL
5 NULL NULL NULL 6 7 NULL NULL
NULL 8 9 NULL NULL NULL 10 0
*/
BMadman 2009-12-17
  • 打赏
  • 举报
回复
你说的栏位的名称是指列名?我想只能通过列名来判断是否重复。。
hery2002 2009-12-17
  • 打赏
  • 举报
回复
完全是自动的无关联的FULL JOIN,只根据栏位的名称来判断是否重复?
BMadman 2009-12-17
  • 打赏
  • 举报
回复
3个表都独立的,但要说有联系也是只都属于‘材料’范畴。
BMadman 2009-12-17
  • 打赏
  • 举报
回复
无关联条件。。
hery2002 2009-12-17
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 bmadman 的回复:]
3个表都是预先建立好的,只有ID和NAME字段是开始就有的,剩下的属于属性字段,是动态添加的。
[/Quote]
那你的关联条件是按照ID和NAME来关联的对不对?还需要关联其他条件吗?
BMadman 2009-12-17
  • 打赏
  • 举报
回复
3个表都是预先建立好的,只有ID和NAME字段是开始就有的,剩下的属于属性字段,是动态添加的。
hery2002 2009-12-17
  • 打赏
  • 举报
回复
你这几个表是预先建立好的,还是动态添加的?
BMadman 2009-12-17
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 hery2002 的回复:]
引用 9 楼 bmadman 的回复:
现在有3个表,都有字段a,我用FULL JOIN查询出来,怎么让a列只显示1列。。
情况说明:现在做印刷厂的一个项目,分主料表,辅料表,其他材料表,初始每个表只有ID,NAME两个字段,可以添加料的属性,也就是在数据库里加列。。所以我不能确定他的列名是什么,当然就有可能重复。。。我现在需要一个试图,把3个表的所有数据,查出来。FULL JOIN可以满足我这个要求,但是。。如果重复了就不行了。。因为后面还有别的处理。。不知道大家明白了么。。

这个需求...
如果你的列明不确定,那怎么确定哪些是重复的,哪些不是重复的?
[/Quote]
我如果确定也就不会出来问了。。呵呵,实打实看看SQL是不是有什么比对功能的。。。
hery2002 2009-12-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bmadman 的回复:]
现在有3个表,都有字段a,我用FULL JOIN查询出来,怎么让a列只显示1列。。
情况说明:现在做印刷厂的一个项目,分主料表,辅料表,其他材料表,初始每个表只有ID,NAME两个字段,可以添加料的属性,也就是在数据库里加列。。所以我不能确定他的列名是什么,当然就有可能重复。。。我现在需要一个试图,把3个表的所有数据,查出来。FULL JOIN可以满足我这个要求,但是。。如果重复了就不行了。。因为后面还有别的处理。。不知道大家明白了么。。
[/Quote]
这个需求...
如果你的列明不确定,那怎么确定哪些是重复的,哪些不是重复的?
BMadman 2009-12-17
  • 打赏
  • 举报
回复
实打实后台处理我10分钟写出来。。不过我就想在SQL了处理了。。挺悲剧的
jgjgjg23 2009-12-17
  • 打赏
  • 举报
回复
JF
hery2002 2009-12-17
  • 打赏
  • 举报
回复
动态的话,就把那几个换成动态执行就是了啥....
原理都已经出来了.
BMadman 2009-12-17
  • 打赏
  • 举报
回复
主料表结构:
USE [PrintingProject]
GO
/****** 对象: Table [dbo].[DH_A_Material] 脚本日期: 12/17/2009 15:22:43 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[DH_A_Material](
[A_Material_Id] [uniqueidentifier] NOT NULL,
[A_Material_Name] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[a] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[b] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[c] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[d] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[e] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_DH_A_MATERIAL] PRIMARY KEY CLUSTERED
(
[A_Material_Id] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF

辅料表结构:

USE [PrintingProject]
GO
/****** 对象: Table [dbo].[DH_M_Material] 脚本日期: 12/17/2009 15:24:25 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[DH_M_Material](
[M_Material_Id] [uniqueidentifier] NOT NULL,
[M_Material_Name] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[a] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[f] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[g] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_DH_M_MATERIAL] PRIMARY KEY CLUSTERED
(
[M_Material_Id] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF

其它材料表结构:

USE [PrintingProject]
GO
/****** 对象: Table [dbo].[DH_O_Material] 脚本日期: 12/17/2009 15:25:33 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[DH_O_Material](
[O_Material_Id] [uniqueidentifier] NOT NULL,
[O_Material_Name] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[b] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[c] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[h] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[i] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_DH_O_MATERIAL] PRIMARY KEY CLUSTERED
(
[O_Material_Id] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF


除了各个ID和NAME都是动态生成字段。。
BMadman 2009-12-17
  • 打赏
  • 举报
回复
动态的。。我怎么发表结构。。甚悲剧的问题。。
BMadman 2009-12-17
  • 打赏
  • 举报
回复
现在有3个表,都有字段a,我用FULL JOIN查询出来,怎么让a列只显示1列。。
情况说明:现在做印刷厂的一个项目,分主料表,辅料表,其他材料表,初始每个表只有ID,NAME两个字段,可以添加料的属性,也就是在数据库里加列。。所以我不能确定他的列名是什么,当然就有可能重复。。。我现在需要一个试图,把3个表的所有数据,查出来。FULL JOIN可以满足我这个要求,但是。。如果重复了就不行了。。因为后面还有别的处理。。不知道大家明白了么。。
guguda2008 2009-12-17
  • 打赏
  • 举报
回复
这谁设计的动态列名,如果要根据表与表之间的列名作为连接条件的话就要通过查COLUMNS拼一堆SQL了吧
dawugui 2009-12-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 bmadman 的回复:]
还是刚才3表联合FULL JOIN查询的问题。。
你刚才最后写的SQL语句的是在指导有什么字段的情况下解决的。。如果我不知道有什么字段。指我这3个表的字段可以动态添加。。如果列名一样。。我怎么去掉重复的?
QQ:317926070,真的很感谢你。。这个问题令我很苦恼。。
[/Quote]
最好给出完整的表结构,测试数据,计算方法和正确结果.


发帖注意事项
http://topic.csdn.net/u/20091130/21/fb718680-98ff-4afb-98d8-cff2f8293ed5.html?24281
加载更多回复(6)

22,210

社区成员

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

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