一张表t1(Place, Name),
南京,张一
南京,张二
南京,张三
南京,张四
北京,小一
北京,小二
北京,小三另一张表t2(Place, Name),
南京,王一
南京,王二
南京,王三
北京,大一
北京,大二
北京,大三
北京,大四
要求查询的结果是
南京 张一 王一
南京 张二 王二
南京 张三 王三
南京 张四 (空)
北京 小一 大一
北京 小二 大二
北京 小三 大三
北京 (空) 大四要说明的,并不是一定要 张一 和王一 搭配,而是某个地点 比如南京的纪录,两两组配,只要出现一次,下次就不要出现了。
蛮有难度的,请各位
指点。
南京,张一
南京,张二
南京,张三
南京,张四
北京,小一
北京,小二
北京,小三另一张表t2(Place, Name),
南京,王一
南京,王二
南京,王三
北京,大一
北京,大二
北京,大三
北京,大四
要求查询的结果是
南京 张一 王一
南京 张二 王二
南京 张三 王三
南京 张四 (空)
北京 小一 大一
北京 小二 大二
北京 小三 大三
北京 (空) 大四要说明的,并不是一定要 张一 和王一 搭配,而是某个地点 比如南京的纪录,两两组配,只要出现一次,下次就不要出现了。
蛮有难度的,请各位
指点。
解决方案 »
- 绑定GridView时,怎么获得控件ID,如button控件~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- IIS下的ASP.NET 4.0是什么?有什么新特性吗?
- 求只允许gmail信箱的email地址正则表达式
- 讨论:如何选择信息系统的web(dotnet)的快速开发架构?
- ASP.NET中,如何让Excel等文件直接打开,而不是提示保存?急......
- 如何在webconfig里 格式化日期的格式?
- 关于在asp.net上邮件发送时遇到的问题
- Datalist一列显示一个字段的多条数据的奇怪问题。
- 有关网站登录的问题?
- asp.net web应用程序不能该地址
- gridview 存储过程返回值
- asp.net 下树控件无法展开得问题,十万火急,在线等。。。
go
use Testdb
goCREATE TABLE [dbo].[testTable1](
[Pkid] [int] IDENTITY(1,1) NOT NULL,
[tPlace] [nvarchar](255) NULL,
[tName] [nvarchar](50) NULL,
CONSTRAINT [PK_TestTable1] PRIMARY KEY CLUSTERED
(
[Pkid] ASC
) ON [PRIMARY]
) ON [PRIMARY]CREATE TABLE [dbo].[testTable2](
[Pkid] [int] IDENTITY(1,1) NOT NULL,
[tPlace] [nvarchar](255) NULL,
[tName] [nvarchar](50) NULL,
CONSTRAINT [PK_TestTable2] PRIMARY KEY CLUSTERED
(
[Pkid] ASC
) ON [PRIMARY]
) ON [PRIMARY]SET Identity_Insert dbo.testTable1 ON
INSERT INTO dbo.testTable1(
Pkid,tPlace,tName)
VALUES (
1,
'南京','张一')
GO
INSERT INTO dbo.testTable1(
Pkid,tPlace,tName)
VALUES (
2,
'南京','张二')
GO
INSERT INTO dbo.testTable1(
Pkid,tPlace,tName)
VALUES (
3,
'南京','张三')
GO
INSERT INTO dbo.testTable1(
Pkid,tPlace,tName)
VALUES (
4,
'南京','张四')
GO
INSERT INTO dbo.testTable1(
Pkid,tPlace,tName)
VALUES (
5,
'北京','小一')
GO
INSERT INTO dbo.testTable1(
Pkid,tPlace,tName)
VALUES (
6,
'北京','小二')
GO
INSERT INTO dbo.testTable1(
Pkid,tPlace,tName)
VALUES (
7,
'北京','小三')
GO
Set Identity_Insert dbo.testTable1 OFFSET Identity_Insert dbo.testTable2 ON
INSERT INTO dbo.testTable2(
Pkid,tPlace,tName)
VALUES (
1,
'南京','王一')
GO
INSERT INTO dbo.testTable2(
Pkid,tPlace,tName)
VALUES (
2,
'南京','王二')
GO
INSERT INTO dbo.testTable2(
Pkid,tPlace,tName)
VALUES (
3,
'南京','王三')
GO
INSERT INTO dbo.testTable2(
Pkid,tPlace,tName)
VALUES (
4,
'北京','大一')
GO
INSERT INTO dbo.testTable2(
Pkid,tPlace,tName)
VALUES (
5,
'北京','大二')
GO
INSERT INTO dbo.testTable2(
Pkid,tPlace,tName)
VALUES (
6,
'北京','大三')
GO
INSERT INTO dbo.testTable2(
Pkid,tPlace,tName)
VALUES (
7,
'北京','大四')
GO
Set Identity_Insert dbo.testTable2 OFF--使用TableVars
Declare @TableVar Table
(PKID int IDENTITY(1,1) Primary Key ,tPlace nvarchar(50),tName1 nvarchar(50),tName2 nvarchar(50),tFrom int )
Declare @TableVar2 Table
(PKID int IDENTITY(1,1) Primary Key ,tPlace nvarchar(50),tName1 nvarchar(50),tName2 nvarchar(50),tID int)
--产生数据源表变量
insert into @TableVar(tPlace,tName1,tFrom) (select tPlace,tName,1 from testTable1 union all select tPlace,tName,2 from testTable2)
--select * from @TableVar
Declare @Flag int
Declare @tempID int
Declare @tempID2 int
Declare @CountID int
Declare @tempPlace nvarchar(50)
Declare @tempName nvarchar(50)
Declare @tempName2 nvarchar(50)
set @CountID=(select count(PKID) from @TableVar)
while(@CountID>0)
Begin
set @Flag=(select Top 1 tFrom from @TableVar)
set @tempPlace=(select Top 1 tPlace from @TableVar where tFrom=@Flag)
set @tempID=(select Top 1 PKID from @TableVar where tFrom=@Flag and tPlace=@tempPlace)
set @tempID2=(select Top 1 PKID from @TableVar where tFrom<>@Flag and tPlace=@tempPlace) set @tempName=(select Top 1 tName1 from @TableVar where tFrom=@Flag and tPlace=@tempPlace)
set @tempName2=(select Top 1 tName1 from @TableVar where tFrom<>@Flag and tPlace=@tempPlace)
insert into @TableVar2 (tPlace,tID) select Top 1 tPlace,PKID from @TableVar where (tPlace=@tempPlace)
--print @tempName
--print @tempName2
if(@Flag=1)
update @TableVar2 set tName1=@tempName ,tName2=@tempName2 where tID=@tempID
else if(@Flag=2)
update @TableVar2 set tName2=@tempName ,tName1=@tempName2 where tID=@tempID
else
continue
delete from @TableVar where (PKID=@tempID or PKID=@tempID2) and Tplace=@tempPlace
set @CountID=(select count(PKID) from @TableVar)
END
Select * from @TableVar2
结果:
1 南京 张一 王一 1
2 南京 张二 王二 2
3 南京 张三 王三 3
4 南京 张四 NULL 4
5 北京 小一 大一 5
6 北京 小二 大二 6
7 北京 小三 大三 7
8 北京 NULL 大四 14--use Master
--go
--drop database Testdb
inner join t2 on t1.place=t2.place
CREATE TABLE t1 (Place VARCHAR(10), Name VARCHAR(10))
INSERT t1 SELECT '南京','张一'
UNION ALL SELECT '南京','张二'
UNION ALL SELECT '南京','张三'
UNION ALL SELECT '南京','张四'
UNION ALL SELECT '北京','小一'
UNION ALL SELECT '北京','小二'
UNION ALL SELECT '北京','小三'
UNION ALL SELECT '武汉','大四'
CREATE TABLE t2 (Place VARCHAR(10), Name VARCHAR(10))
INSERT t2 SELECT '南京','王一'
UNION ALL SELECT '南京','王二'
UNION ALL SELECT '南京','王x'
UNION ALL SELECT '南京','王y'
UNION ALL SELECT '南京','王z'
UNION ALL SELECT '南京','王a'
UNION ALL SELECT '北京','大一'
UNION ALL SELECT '北京','大二'
UNION ALL SELECT '北京','大三'
UNION ALL SELECT '北京','大四'
UNION ALL SELECT '西安','大四'
SELECT IDENTITY(int) ID ,* INTO #1 FROM t1 ORDER BY Place
SELECT IDENTITY(int) ID ,* INTO #2 FROM t2 ORDER BY Place
SELECT ISNULL(a.Place,b.Place) Place,
a.Name,
b.Name
FROM
(SELECT Place,Name,
(SELECT COUNT(*) FROM #1 WHERE Place=x.Place AND ID<=x.ID
) idx
FROM #1 x
) a
FULL JOIN
(SELECT Place,Name,
(SELECT COUNT(*) FROM #2 WHERE Place=x.Place AND ID<=x.ID
) idx
FROM #2 x
) b
ON a.Place=b.Place AND b.idx=ISNULL(a.idx,b.idx)DROP TABLE t1,t2,#1,#2
/*
Place NameFromT1 NameFromT2
北京 小一 大一
北京 小二 大二
北京 小三 大三
北京 NULL 大四
南京 张一 王z
南京 张二 王a
南京 张三 王一
南京 张四 王二
南京 NULL 王x
南京 NULL 王y
西安 NULL 大四
武汉 大四 NULL
*/
是为了提高效率。四楼的方法应该也可以改成表变量法。
而表变量在sql2000就支持了!
数据量大,临时表是会比表变量慢,但几十万的数据放在表变量里你觉得合理吗?
有一个原则, 效率高的,不一定是最好的. 看你是要效率,还是要减服务器压力. 多的就不说了.另外,用表变量还是临时表,都是为了一个identity列.sql2005中可以用row_number
---------
这不是行列转换代码吗
-------------------------很负责任的告诉你,不是.