求 二个简单的 SQL语句

zhaoxiaoyang5156 2007-08-03 08:07:51
(不会的也顶一下,关注也行,会的不想答的也顶一下)小弟 在此地谢谢了。。就还有82分了。

"Persons" 表:
编号 LastName FirstName Address City
001 Hansen Ola Timoteivn 10 Sandnes
002 Svendson Tove Borgvn 23 Sandnes
003 Pettersen Kari Storgt 20 Stavanger

"Orders"表:
编号 Company OrderNumber
001 Sega 3412
001 W3School 2312
001 Trio 4678
002 W3School 6798


问题一:
我用 select * from Persons where LastName='Hansen'
结果是:
编号 LastName FirstName Address City
001 Hansen Ola Timoteivn 10 Sandnes
如果我想得到 下面一样的结果:

编号 LastName FirstName Address City
001 Hansen Ola Timoteivn 10 Sandnes
001 Hansen Ola Timoteivn 10 Sandnes
001 Hansen Ola Timoteivn 10 Sandnes
001 Hansen Ola Timoteivn 10 Sandnes
该用什么SQL语句,谢谢。

问题二:
我们看这二个表,不难发现,Persons和Orders表是一对多的关系
那么我想用SQL语句等到下面的结果,请问该如何写SQL语句

编号 Company OrderNumber
001 Sega,W3School,Trio 3412,2312,4678
002 W3School 6798
003



...全文
786 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
liubocd 2007-10-17
  • 打赏
  • 举报
回复
看了感觉很不错,学习的东西太多了
zhaoxiaoyang5156 2007-08-08
  • 打赏
  • 举报
回复
恩,,夠多的。。朋友。謝謝。
juntor 2007-08-07
  • 打赏
  • 举报
回复
数据条数要增多很容易的啊.
你在From 后面再加一个,syscolumns c就可以了.

select top 4 a.*
from Persons a,syscolumns b,syscolumns c
where a.LastName='Hansen'

这其实是交叉联接.求的是笛卡尔积的.
你只能查出最多574条记录,说明你的syscolumns表只有574行记录.
在语句中再加一个,syscolumns c的结果是你可以查出最多574*574=329476条记录
够多了吧.呵呵
paoluo 2007-08-06
  • 打赏
  • 举报
回复

--創建測試環境
Create Table Persons
(编号 Char(3),
LastName Varchar(20),
FirstName Varchar(20),
Address Varchar(20),
City Varchar(20))
Insert Persons Select '001', 'Hansen', 'Ola', 'Timoteivn 10', 'Sandnes'
Union All Select '002', 'Svendson', 'Tove', 'Borgvn 23', 'Sandnes'
Union All Select '003', 'Pettersen', 'Kari', 'Storgt 20', 'Stavanger'

Create Table Orders
(编号 Char(3),
Company Varchar(20),
OrderNumber Int)
Insert Orders Select '001', 'Sega', 2312
Union All Select '001', 'W3School', 2312
Union All Select '001', 'Trio', 4678
Union All Select '002', 'W3School', 6798
GO
--測試
--问题一
select * from Persons where LastName='Hansen'
union all
select * from Persons where LastName='Hansen'
union all
select * from Persons where LastName='Hansen'
union all
select * from Persons where LastName='Hansen'
GO

--問題二
--創建函數
Create Function F_Get_Orders(@编号 Char(3), @Flag Bit)
Returns Varchar(8000)
As
Begin
Declare @S Varchar(8000)
Select @S = ''
If(@Flag = 0)
Select @S = @S + ',' + Company From Orders Where 编号 = @编号 Order By OrderNumber
Else
Select @S = @S + ',' + Cast(OrderNumber As Varchar(100)) From Orders Where 编号 = @编号 Group By OrderNumber
Select @S = Stuff(@S, 1, 1, '')
Return @S
End
GO
--調用
Select 编号, dbo.F_Get_Orders(编号, 0) As Company, dbo.F_Get_Orders(编号, 1) As OrderNumber From Persons
GO
--刪除測試環境
Drop Table Persons, Orders
Drop Function F_Get_Orders
GO
--結果
/*
--问题一結果
编号 LastName FirstName Address City
001 Hansen Ola Timoteivn 10 Sandnes
001 Hansen Ola Timoteivn 10 Sandnes
001 Hansen Ola Timoteivn 10 Sandnes
001 Hansen Ola Timoteivn 10 Sandnes

--问题二結果
编号 CompanyOrder Number
001 Sega,W3School,Trio 2312,4678
002 W3School 6798
003 NULL NULL
*/

paoluo 2007-08-06
  • 打赏
  • 举报
回复
zhaoxiaoyang5156() ,稍微修改下函數即可

--創建函數
Create Function F_Get_Orders(@编号 Char(3), @Flag Bit)
Returns Varchar(8000)
As
Begin
Declare @S Varchar(8000)
Select @S = ''
If(@Flag = 0)
Select @S = @S + ',' + Company From Orders Where 编号 = @编号 Order By OrderNumber
Else
Select @S = @S + ',' + Cast(OrderNumber As Varchar(100)) From Orders Where 编号 = @编号 Group By OrderNumber
Select @S = Stuff(@S, 1, 1, '')
Return @S
End
GO
zhaoxiaoyang5156 2007-08-06
  • 打赏
  • 举报
回复
朋友:juntor()
可惜你的只能查最多574 條 出來。。不能查大于574 的出來啊。。。當然這個已夠好了。
zhaoxiaoyang5156 2007-08-06
  • 打赏
  • 举报
回复
paoluo(一天到晚游泳的鱼)
請到http://community.csdn.net/Expert/TopicView.asp?id=5693352
接分
juntor 2007-08-06
  • 打赏
  • 举报
回复
--测试环境同 paoluo(一天到晚游泳的鱼) ( ) 信誉:100
--问题1
select top 4 a.*
from Persons a,syscolumns b
where a.LastName='Hansen'

--问题2
--同 paoluo(一天到晚游泳的鱼) ( ) 信誉:100

suncrafted 2007-08-05
  • 打赏
  • 举报
回复
-- 多行多列连接成为单行单列示例:需要一个自定义函数
-- http://community.csdn.net/Expert/TopicView3.asp?id=5603231

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[VertToHorzSample]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[VertToHorzSample]
GO

-- 建立测试数据
CREATE TABLE VertToHorzSample(
Column1 int,
Column2 varchar(100)
)

GO

INSERT INTO VertToHorzSample(Column1, Column2)
SELECT 1, 'A'
UNION ALL
SELECT 1, 'B'
UNION ALL
SELECT 2, 'C'
UNION ALL
SELECT 2, 'D'
UNION ALL
SELECT 2, 'E'
UNION ALL
SELECT 3, 'F'

GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ConvertVertToHorz]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[ConvertVertToHorz]
GO

-- 建立辅助函数
CREATE FUNCTION ConvertVertToHorz(@Col1Val int)
RETURNS VARCHAR(8000)
AS
BEGIN
-- 实际项目中,应该考虑 @RetVal 是否会超过 8000 个字符
DECLARE @RetVal varchar(8000)
SET @RetVal = ''
-- 通过递归 SELECT 连接指定列存储到临时变量中
SELECT @RetVal = Column2 + ',' + @RetVal FROM VertToHorzSample WHERE Column1 = @Col1Val
-- 连接多列
-- SELECT @RetVal = Column2 + ',' + Column3 + ',' + Column4 + ',' + @RetVal FROM VertToHorzSample WHERE Column1 = @Col1Val

-- 去掉尾巴的 , (逗号)
IF LEN(@RetVal) > 0
SET @RetVal = LEFT(@RetVal, LEN(@RetVal) - 1)
--PRINT @RetVal

RETURN @RetVal
END

GO

-- 测试
SELECT Column1, dbo.ConvertVertToHorz(Column1) Column2 FROM (SELECT DISTINCT Column1 FROM VertToHorzSample) t
/**//*
Column1 Column2
----------- ------------------
1 A,B
2 C,D,E
3 F
*/

GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[VertToHorzView]') and OBJECTPROPERTY(id, N'IsView') = 1)
drop view [dbo].[VertToHorzView]
GO

-- 可以建立一个视图
CREATE VIEW dbo.VertToHorzView
AS
SELECT Column1, dbo.ConvertVertToHorz(Column1) Column2
FROM (SELECT DISTINCT Column1 FROM dbo.VertToHorzSample) t

GO

-- 测试视图
SELECT * FROM VertToHorzView
/**//*
Column1 Column2s
----------- -----------------
1 A,B
2 C,D,E
3 F
*/
ekinchen3 2007-08-04
  • 打赏
  • 举报
回复
是都用游标
John1CSDN 2007-08-04
  • 打赏
  • 举报
回复
问题一:
select orders.编号,p.lastname,p.firstname,p.address,p.city from orders left join persons p
on orders.编号 = p.编号 and orders.编号='001'
paoluo 2007-08-04
  • 打赏
  • 举报
回复
--創建測試環境
Create Table Persons
(编号 Char(3),
LastName Varchar(20),
FirstName Varchar(20),
Address Varchar(20),
City Varchar(20))
Insert Persons Select '001', 'Hansen', 'Ola', 'Timoteivn 10', 'Sandnes'
Union All Select '002', 'Svendson', 'Tove', 'Borgvn 23', 'Sandnes'
Union All Select '003', 'Pettersen', 'Kari', 'Storgt 20', 'Stavanger'

Create Table Orders
(编号 Char(3),
Company Varchar(20),
OrderNumber Int)
Insert Orders Select '001', 'Sega', 3412
Union All Select '001', 'W3School', 2312
Union All Select '001', 'Trio', 4678
Union All Select '002', 'W3School', 6798
GO
--測試
--问题一
select * from Persons where LastName='Hansen'
union all
select * from Persons where LastName='Hansen'
union all
select * from Persons where LastName='Hansen'
union all
select * from Persons where LastName='Hansen'
GO

--問題二
--創建函數
Create Function F_Get_Orders(@编号 Char(3), @Flag Bit)
Returns Varchar(8000)
As
Begin
Declare @S Varchar(8000)
Select @S = ''
If(@Flag = 0)
Select @S = @S + ',' + Company From Orders Where 编号 = @编号
Else
Select @S = @S + ',' + Cast(OrderNumber As Varchar(100)) From Orders Where 编号 = @编号
Select @S = Stuff(@S, 1, 1, '')
Return @S
End
GO
--調用
Select 编号, dbo.F_Get_Orders(编号, 0) As Company, dbo.F_Get_Orders(编号, 1) As OrderNumber From Persons
GO
--刪除測試環境
Drop Table Persons, Orders
Drop Function F_Get_Orders
GO
--結果
/*
--问题一結果
编号 LastName FirstName Address City
001 Hansen Ola Timoteivn 10 Sandnes
001 Hansen Ola Timoteivn 10 Sandnes
001 Hansen Ola Timoteivn 10 Sandnes
001 Hansen Ola Timoteivn 10 Sandnes

--问题二結果
编号 Company OrderNumber
001 Sega,W3School,Trio 3412,2312,4678
002 W3School 6798
003 NULL NULL
*/
paoluo 2007-08-04
  • 打赏
  • 举报
回复
--問題二
--創建函數
Create Function F_Get_Orders(@编号 Char(3), @Flag Bit)
Returns Varchar(8000)
As
Begin
Declare @S Varchar(8000)
Select @S = ''
If(@Flag = 0)
Select @S = @S + ',' + Company From Orders Where 编号 = @编号
Else
Select @S = @S + ',' + Cast(OrderNumber As Varchar(100)) From Orders Where 编号 = @编号
Select @S = Stuff(@S, 1, 1, '')
Return @S
End
GO
--調用
Select 编号, dbo.F_Get_Orders(编号, 0) As Company, dbo.F_Get_Orders(编号, 1) As OrderNumber From Persons
GO
paoluo 2007-08-04
  • 打赏
  • 举报
回复
software_developer() ( ) 信誉:100 2007-8-3 23:49:52 得分: 0



问题一
select * from Persons where LastName='Hansen'
union
select * from Persons where LastName='Hansen'
union
select * from Persons where LastName='Hansen'
union
select * from Persons where LastName='Hansen'
问题二
也想知道。。。。学习中。。。。



-------------

用union可以實現嗎?

提醒以下,union會合併重復,union all不會合併重復



问题一
select * from Persons where LastName='Hansen'
union all
select * from Persons where LastName='Hansen'
union all
select * from Persons where LastName='Hansen'
union all
select * from Persons where LastName='Hansen'

问题二

MS SQL2000中使用函數實現
jxzhoumin 2007-08-04
  • 打赏
  • 举报
回复
两个都用游标
zhaoxiaoyang5156 2007-08-04
  • 打赏
  • 举报
回复
问题补充:
如果是下面的数据
"Persons" 表:
编号 LastName FirstName Address City
001 Hansen Ola Timoteivn 10 Sandnes
002 Svendson Tove Borgvn 23 Sandnes
003 Pettersen Kari Storgt 20 Stavanger

"Orders"表:
编号 Company OrderNumber
001 Sega 2312
001 W3School 2312
001 Trio 4678
002 W3School 6798


查询的结果是:
编号 Company OrderNumber
001 Sega,W3School,Trio 2312,4678
002 W3School 6798
003

不同的地方是,,当合并的数据相同时候,,只出现一次。
如:
001 Sega 2312
001 W3School 2312

2312 出现了二次

但是查找的结果。
001 Sega,W3School,Trio 2312,4678

的2312 出现一次。。看那位路过的朋友,能解答。(加大了难度哦。)


xzg715 2007-08-04
  • 打赏
  • 举报
回复
挺好!!!!!!!!!顶顶!!!!
software_developer 2007-08-03
  • 打赏
  • 举报
回复
问题一
select * from Persons where LastName='Hansen'
union
select * from Persons where LastName='Hansen'
union
select * from Persons where LastName='Hansen'
union
select * from Persons where LastName='Hansen'
问题二
也想知道。。。。学习中。。。。
WWWFIND 2007-08-03
  • 打赏
  • 举报
回复
问题一:
在前台处理好于在SQL中处理。
数据填充在dataSet1中,然后
for (int i=0;i<n;i++)
{
dataSet2.Merge(dataSet1.Tables[0],true,MissingSchemaAction.Add);
}
问题二:
如果用的oracle数据库则下面的文章可以解决这个问题
http://blog.csdn.net/WWWFIND/archive/2006/09/24/1271807.aspx

如果是利用水晶报表的显示数据,可以尝试在水晶报表利用分组处理。
wheatlee 2007-08-03
  • 打赏
  • 举报
回复
问题1:
我的想法是:建一个临时表#temp,写while循环将select出来的插入到临时表。待循环结束后,在select * from #temp 就好了。

问题2:
不会,学习中
加载更多回复(14)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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