【难】求一SQL查询语句
健者天行 2007-04-07 10:47:02
下面是创建测试数据的脚本,请copy到 SQL Query Analyzer中查看。
----------------------------------------------------------------------
use pubs
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Orders]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Orders]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Orders_Child1]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Orders_Child1]
GO
CREATE TABLE [dbo].[Orders] (
[OrderID] [int] NOT NULL ,
[OrderCode] [varchar] (10) NOT NULL ,
[OrderCount] [int] NULL ,
[OrderRemark] [nvarchar] (50) NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Orders_Child1] (
[ChildID] [int] NOT NULL ,
[OrderID] [int] NOT NULL ,
[Date1] [smalldatetime] NULL ,
[Number1] [int] NULL ,
[Text1] [nvarchar] (20) NULL ,
[Text2] [nvarchar] (20) NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Orders] WITH NOCHECK ADD
CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED
(
[OrderID]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Orders_Child1] WITH NOCHECK ADD
CONSTRAINT [PK_Orders_Child1] PRIMARY KEY CLUSTERED
(
[ChildID]
) ON [PRIMARY]
GO
insert into orders
select 1,'A01',10000,'A01文本备注'
union select 2,'A02',20000,'A02文本备注'
union select 3,'A03',25000,'A03文本内容'
insert into orders_Child1
select 1,1,'2007-01-01',1000,'A01的文本1','齐'
union select 2,1,'2007-01-02',2000,'A01的文本2','齐'
union select 3,1,'2007-01-03',2000,'A01的文本3','齐'
union select 4,2,'2007-01-04',100, 'A02的文本1','不齐'
union select 5,2,'2007-01-05',200, 'A02的文本2','不齐'
union select 6,2,'2007-01-06',200, NULL ,'不齐'
union select 7,3,'2007-01-07',10000,'A03的文本1','齐'
union select 8,3,'2007-01-08',NULL , NULL , '不齐'
----------------------------------------------------------------------
select * from Orders
select * from Orders_Child1
想得到的结果:
OrderID OrderCode OrderCount OrderRemark Date1 Number1 Text1 Text2
----------- ---------- ----------- ----------- ---------- ---------- ------------------------------- --------------------
1 A01 10000 A01文本备注 2007-01-03 5000 A01的文本1,A01的文本2,A01的文本3 齐
2 A02 20000 A02文本备注 2007-01-06 500 A02的文本1,A02的文本2 不齐
3 A03 25000 A03文本内容 2007-01-08 10000 A03的文本1 不齐
说明:
Date1: 取对应子行中的最大值
Number1: 对应子行求和
Text1: 对应子行文本串联叠加
Text2: 若所有对应子行文本内容相同,则显示相同值 '齐'/'不齐';
若有齐有不齐的,刚显示'不齐';如果Text2不好做,先略过。
希望一个视图中实现,如果实在不行,再考滤存储过程中实现。
感觉一个视图中实现有点难度,视图我是没办法了,请教各位高手。
实际环境中类似于“Orders_Child1”的子表有很多个,需要把这些 1:N 的子表连接成跟主表“Orders”的行是 1:1 关系。
谢谢