求大神解惑

a564951755 2016-10-14 05:07:31
各位大神,有一个问题,从一张表里取到一些数据,关联另一张表后,通过部分条件筛选,怎么能让某一字段自动增加1,需要自动增加1的字段为code,需要关联的字段为 level、type_code,需要实现的效果是,根据level、type_code,确定新加的code属于1、2、3、4 那一类里面,并且根据类别自动在下面增加1
表如下:
code name level type_code
1001 三 1 D
1003 七 2 D
2001 四 1 C
2002 八 2 C
3001 五 2 B
4001 六 3 D
...全文
255 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
a564951755 2016-10-22
  • 打赏
  • 举报
回复
引用 5 楼 roy_88 的回复:
给你写个例子参照,根据业务自行调整逻辑

e.g.

--code name level type_code
--1001 三 1 D
--1003 七 2 D
--2001 四 1 C
--2002 八 2 C
--3001 五 2 B
--4001 六 3 D

use Tempdb
go
--> --> 中国风(Roy)生成測試數據

if not object_id(N'Test1') is null
drop table Test1
Go
Create table Test1([code] int,[name] nvarchar(21),[level] int,[type_code] nvarchar(21))
GO

if not object_id(N'SerialNumber') is null
drop table SerialNumber
Go
CREATE TABLE SerialNumber(
TypeCode VARCHAR(5) PRIMARY KEY
,TypeNr VARCHAR(2) UNIQUE
,NextNr INT
,NrLength INT
);
GO

CREATE TRIGGER tr_Test1 ON Test1
INSTEAD OF INSERT
AS
SET NOCOUNT ON;
BEGIN
DECLARE @TypeNr INT
SELECT @TypeNr=ISNULL(MAX(TypeNr),0) FROM dbo.SerialNumber
IF EXISTS(SELECT 1 FROM inserted AS i WHERE NOT EXISTS(SELECT 1 FROM dbo.SerialNumber WHERE TypeCode=i.type_code) )
BEGIN
INSERT INTO dbo.SerialNumber
( TypeCode, TypeNr, NextNr, NrLength )
SELECT
type_code,@TypeNr+ROW_NUMBER()OVER(ORDER BY RAND()),1,3
FROM Inserted
GROUP BY type_code
END
INSERT INTO dbo.Test1
( code, name, level, type_code )

SELECT
s.TypeNr+RIGHT(100000+s.NextNr+ROW_NUMBER()OVER(PARTITION BY i.type_code ORDER BY i.level)-1,s.NrLength),
i.name,
s.NextNr+ROW_NUMBER()OVER(PARTITION BY i.type_code ORDER BY i.level)-1
,i.type_code
FROM Inserted AS i
INNER JOIN dbo.SerialNumber AS s ON i.type_code=s.TypeCode

UPDATE s SET s.NextNr=s.NextNr+i.con FROM (SELECT type_code,COUNT(1) AS con FROM Inserted GROUP BY type_code) AS i INNER JOIN dbo.SerialNumber AS s ON i.type_code=s.TypeCode
END
GO
--测试
Insert Test1(name,type_code)
select N'三',N'D' union all
select N'七',N'D'
Insert Test1(name,type_code)
SELECT N'四',N'C' union all
select N'八',N'C'
Insert Test1(name,type_code)
select N'五',N'B'
Insert Test1(name,type_code)
SELECT N'六',N'D'

--查看
SELECT * FROM dbo.Test1
/*
code name level type_code
1001 三 1 D
1002 七 2 D
2001 四 1 C
2002 八 2 C
3001 五 1 B
1003 六 3 D
*/
--删除测试
--DROP TABLE test1,dbo.SerialNumber



上一条说的不清楚,是这样的大神,比如1001 level 这个字段 是1,1002 level 也是1,然后还需要传进来一个100101 这个level就是2了,这样的话 需要怎么能生成呢,level 这个字段当时没写好,这部分不是按顺序生成的,应该是我这边做匹配项的,麻烦大神了
a564951755 2016-10-22
  • 打赏
  • 举报
回复
引用 5 楼 roy_88 的回复:
给你写个例子参照,根据业务自行调整逻辑

e.g.

--code name level type_code
--1001 三 1 D
--1003 七 2 D
--2001 四 1 C
--2002 八 2 C
--3001 五 2 B
--4001 六 3 D

use Tempdb
go
--> --> 中国风(Roy)生成測試數據

if not object_id(N'Test1') is null
drop table Test1
Go
Create table Test1([code] int,[name] nvarchar(21),[level] int,[type_code] nvarchar(21))
GO

if not object_id(N'SerialNumber') is null
drop table SerialNumber
Go
CREATE TABLE SerialNumber(
TypeCode VARCHAR(5) PRIMARY KEY
,TypeNr VARCHAR(2) UNIQUE
,NextNr INT
,NrLength INT
);
GO

CREATE TRIGGER tr_Test1 ON Test1
INSTEAD OF INSERT
AS
SET NOCOUNT ON;
BEGIN
DECLARE @TypeNr INT
SELECT @TypeNr=ISNULL(MAX(TypeNr),0) FROM dbo.SerialNumber
IF EXISTS(SELECT 1 FROM inserted AS i WHERE NOT EXISTS(SELECT 1 FROM dbo.SerialNumber WHERE TypeCode=i.type_code) )
BEGIN
INSERT INTO dbo.SerialNumber
( TypeCode, TypeNr, NextNr, NrLength )
SELECT
type_code,@TypeNr+ROW_NUMBER()OVER(ORDER BY RAND()),1,3
FROM Inserted
GROUP BY type_code
END
INSERT INTO dbo.Test1
( code, name, level, type_code )

SELECT
s.TypeNr+RIGHT(100000+s.NextNr+ROW_NUMBER()OVER(PARTITION BY i.type_code ORDER BY i.level)-1,s.NrLength),
i.name,
s.NextNr+ROW_NUMBER()OVER(PARTITION BY i.type_code ORDER BY i.level)-1
,i.type_code
FROM Inserted AS i
INNER JOIN dbo.SerialNumber AS s ON i.type_code=s.TypeCode

UPDATE s SET s.NextNr=s.NextNr+i.con FROM (SELECT type_code,COUNT(1) AS con FROM Inserted GROUP BY type_code) AS i INNER JOIN dbo.SerialNumber AS s ON i.type_code=s.TypeCode
END
GO
--测试
Insert Test1(name,type_code)
select N'三',N'D' union all
select N'七',N'D'
Insert Test1(name,type_code)
SELECT N'四',N'C' union all
select N'八',N'C'
Insert Test1(name,type_code)
select N'五',N'B'
Insert Test1(name,type_code)
SELECT N'六',N'D'

--查看
SELECT * FROM dbo.Test1
/*
code name level type_code
1001 三 1 D
1002 七 2 D
2001 四 1 C
2002 八 2 C
3001 五 1 B
1003 六 3 D
*/
--删除测试
--DROP TABLE test1,dbo.SerialNumber




大神,谢谢!可能还有一个问题想咨询下,比如1001这个编码,下属还要有一个 100101 这样的 我该如何做区分呢
中国风 2016-10-15
  • 打赏
  • 举报
回复
给你写个例子参照,根据业务自行调整逻辑 e.g.

--code     name      level       type_code    
--1001      三      1             D
--1003     七       2            D
--2001      四      1             C
--2002    八       2             C
--3001      五      2            B
--4001      六      3            D

use Tempdb
go
--> --> 中国风(Roy)生成測試數據
 
if not object_id(N'Test1') is null
	drop table Test1
Go
Create table Test1([code] int,[name] nvarchar(21),[level] int,[type_code] nvarchar(21))
GO

if not object_id(N'SerialNumber') is null
	drop table SerialNumber
Go
CREATE TABLE SerialNumber(
TypeCode VARCHAR(5) PRIMARY KEY
,TypeNr VARCHAR(2) UNIQUE
,NextNr INT
,NrLength INT
);
GO

CREATE TRIGGER tr_Test1 ON Test1
INSTEAD OF INSERT
AS
SET NOCOUNT ON;
BEGIN
DECLARE @TypeNr INT
SELECT  @TypeNr=ISNULL(MAX(TypeNr),0) FROM dbo.SerialNumber 
IF EXISTS(SELECT 1 FROM inserted AS i WHERE NOT EXISTS(SELECT 1 FROM dbo.SerialNumber WHERE TypeCode=i.type_code)  )
BEGIN
	INSERT INTO dbo.SerialNumber
			( TypeCode, TypeNr, NextNr, NrLength )
	SELECT
		type_code,@TypeNr+ROW_NUMBER()OVER(ORDER BY RAND()),1,3
	FROM Inserted
	GROUP BY type_code
END
INSERT INTO dbo.Test1
        ( code, name, level, type_code )

SELECT
s.TypeNr+RIGHT(100000+s.NextNr+ROW_NUMBER()OVER(PARTITION BY i.type_code ORDER BY i.level)-1,s.NrLength),
i.name,
s.NextNr+ROW_NUMBER()OVER(PARTITION BY i.type_code ORDER BY i.level)-1
,i.type_code
FROM Inserted AS i
INNER JOIN dbo.SerialNumber AS s ON i.type_code=s.TypeCode

UPDATE s SET s.NextNr=s.NextNr+i.con FROM (SELECT type_code,COUNT(1) AS con FROM Inserted GROUP BY type_code) AS i INNER JOIN dbo.SerialNumber AS s ON i.type_code=s.TypeCode
END
GO
--测试
Insert Test1(name,type_code)
select N'三',N'D' union all
select N'七',N'D' 
Insert Test1(name,type_code)
SELECT N'四',N'C' union all
select N'八',N'C' 
Insert Test1(name,type_code)
select N'五',N'B' 
Insert Test1(name,type_code)
SELECT N'六',N'D'

--查看
SELECT * FROM dbo.Test1
/*
code	name	level	type_code
1001	三	1	D
1002	七	2	D
2001	四	1	C
2002	八	2	C
3001	五	1	B
1003	六	3	D
*/
--删除测试
--DROP TABLE test1,dbo.SerialNumber
中国风 2016-10-15
  • 打赏
  • 举报
回复
你这样最好用单号记数器记录,如果数据量不大可用触发器或表取最大值
卖水果的net 2016-10-14
  • 打赏
  • 举报
回复
你给出的数据,是源数据,还是你想要的结果 ?
a564951755 2016-10-14
  • 打赏
  • 举报
回复
引用 1 楼 roy_88 的回复:
1001 三 1 D
1003 七 2 D
4001 六 3 D

这里断号?


不是的大神,那个是打错了。。应该是1002,想判断后自动加上 1003。。
中国风 2016-10-14
  • 打赏
  • 举报
回复
1001 三 1 D 1003 七 2 D 4001 六 3 D 这里断号?

22,207

社区成员

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

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