利用SQL语句自动生成序号的两种方式
- 格式:docx
- 大小:23.49 KB
- 文档页数:8
mysql分组排序加序号(不⽤存储过程,就简简单单sql语句哦)做前端好长时间了,好久没动sql了。
在追⼀个喜欢的⼥孩,做测试的,有这么个需求求助与本屌丝,机会难得,开始折腾起来,配置mysql,建库,建表....⼀建表CREATE TABLE `my_test` (`id` int(11) NOT NULL AUTO_INCREMENT,`parent_code` varchar(255) DEFAULT NULL,`code` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=8DEFAULT CHARSET=utf8;⼆模拟数据INSERT INTO `my_test` ( `parent_code`, `code`) VALUES ('01', '001');INSERT INTO `my_test` ( `parent_code`, `code`) VALUES ('01', '002');INSERT INTO `my_test` ( `parent_code`, `code`) VALUES ('02', '001');INSERT INTO `my_test` ( `parent_code`, `code`) VALUES ('01', '003');INSERT INTO `my_test` ( `parent_code`, `code`) VALUES ('02', '002');INSERT INTO `my_test` ( `parent_code`, `code`) VALUES ('03', '001');INSERT INTO `my_test` ( `parent_code`, `code`) VALUES ('04', '001');查询结果如下:三不分组加序号select (@i :=@i+1) rownum,my_test.*from my_test , (SELECT@i :=0) AS a group by parent_code ,code ,id order by parent_code结果如下:解释⼀下这个地⽅⽤了@i变量刚开始的让 @i=0 然后每查询⼀条让 @i+=1四分组排序加序号了刚开始的没思路,就度娘了,有⽤存储过程创建临时表插⼊临时表实现的,还有⽤存储过程游标实现,对于好久没动sql,⽽且之前也没写过mysql 查询的淫来说好复杂,好囧,赶脚要再我⼥神⾯前丢⼈了,but 多谢上天眷顾,查看我⼥神聊天记录的时候,灵感来了,为什么不继续发掘下变量的作⽤呢。
sql 递增写法在SQL中,递增写法主要有两种方式:1. 使用自增(identity)列:自增列是指在插入新行时,数据库会自动为该列赋予一个唯一递增的值。
通常在创建表时,可以使用AUTO_INCREMENT关键字,或者在创建列时使用IDENTITY关键字来定义自增列。
例如:```sqlCREATE TABLE Customers (CustomerID INT PRIMARY KEY AUTO_INCREMENT,CustomerName VARCHAR(255) NOT NULL);INSERT INTO Customers (CustomerName) VALUES ('John');INSERT INTO Customers (CustomerName) VALUES ('Bob');```在上述例子中,每次插入新行时,CustomerID列会自动递增。
2. 使用序列(Sequence):序列是一种数据库对象,用于生成唯一的连续递增值。
在创建序列时,可以指定起始值、步长、最小值和最大值等属性。
然后,在插入新行时,可以使用序列的NEXT VALUE FOR函数获取下一个递增的值。
例如:```sqlCREATE SEQUENCE CustomerSeqSTART WITH 1INCREMENT BY 1MINVALUE 1NO MAXVALUECACHE 10;INSERT INTO Customers (CustomerID, CustomerName)VALUES (NEXT VALUE FOR CustomerSeq, 'John');INSERT INTO Customers (CustomerID, CustomerName)VALUES (NEXT VALUE FOR CustomerSeq, 'Bob');```在上述例子中,使用序列CustomerSeq生成唯一的递增值来填充CustomerID 列。
sql random的用法在SQL中,可以使用以下方法生成随机的结果:1. RAND()函数:RAND()函数返回一个0到1之间的随机数。
可以将其与ORDER BY子句结合使用,以生成随机排序的结果集。
例如:```sqlSELECT column1, column2FROM your_tableORDER BY RAND();```这将返回所有列中的随机行。
2. NEWID()函数:如果使用SQL Server数据库,可以使用NEWID()函数生成随机的唯一标识符(GUID)。
同样可以将其与ORDER BY子句结合使用,以生成随机排序的结果集。
例如:```sqlSELECT column1, column2FROM your_tableORDER BY NEWID();```这将返回所有列中的随机行。
3. TABLESAMPLE子句:如果使用SQL Server或Sybase数据库,可以使用TABLESAMPLE子句来获取一个随机样本。
例如:```sqlSELECT column1, column2FROM your_tableTABLESAMPLE(10 PERCENT); -- 按百分比获取随机样本 ```这将返回一个表的10%的随机行。
4. LIMIT或TOP子句:如果使用MySQL或SQL Server数据库,可以使用LIMIT或TOP子句来限制返回的结果行数和返回的随机行数。
例如:```sqlSELECT column1, column2FROM your_tableORDER BY column1 -- 或其他任何列LIMIT 5; -- 返回5个随机行(MySQL)SELECT TOP 5 column1, column2FROM your_tableORDER BY column1; -- 或其他任何列```这将返回随机的前5行。
请注意,以上方法可能不适用于所有的SQL数据库,具体取决于所使用的数据库管理系统。
sql 含有数字的字符串排序方法SQL中包含数字的字符串排序方法在SQL中,排序操作是一种常见的操作,可以对表格中的数据进行排序。
而在排序操作中,我们常常需要指定排序的依据,以便更好地组织数据。
在某些情况下,我们需要根据字符串中的数字进行排序,这时可以使用以下方法:1. 使用CAST或CONVERT函数将字符串转换为数值类型。
例如,假设我们有一个表格table1,其中包含一个名为“price”的字符串列,我们希望按照字符串中的数字进行升序排序。
我们可以使用以下SQL语句:SELECT * FROM table1 ORDER BY CAST(price AS SIGNED) ASC;在这个语句中,我们使用CAST函数将price列转换为数值类型,并指定为SIGNED,这样就可以处理负数。
然后使用ORDER BY子句按照转换后的数值进行升序排序。
2. 使用自定义排序规则。
在某些情况下,我们可能需要根据字符串中的数字和其他内容进行排序。
这时我们可以使用自定义排序规则。
例如,假设我们有一个表格table2,其中包含一个名为“name”的字符串列和一个名为“score”的数值列。
我们希望按照字符串中的数字和其他内容进行升序排序。
我们可以使用以下SQL语句:SELECT * FROM table2 ORDER BY CAST(SUBSTRING(name, 1,CHARINDEX("-", name)-1) AS SIGNED), score ASC;在这个语句中,我们首先使用SUBSTRING函数提取字符串中的数字部分,然后使用CAST函数将其转换为数值类型。
最后使用ORDER BY 子句按照转换后的数值和score列进行升序排序。
总之,以上两种方法都可以在SQL中实现包含数字的字符串排序操作。
sql查询时增加⾃动编号查询时加序号a:没有主键的情形:Select identity(int,1,1) asiid,* into #tmp from TableNameSelect * from #tmpDroptable #tmpb:有主键的情形:Select (Select sum(1) fromTableName where KeyField <= a.KeyField) as iid,* fromTableName aeg:select (select sum(1) from user_Admin whereid<=a.id) as ID,id,displayName from user_Admin a order by a.ID ascSELECT 序号= (SELECT COUNT(客户编号) FROM 客户 AS LiMing WHERE LiMing.客户编号<= Chang.客户编号), 客户编号, 公司名称 FROM 客户 AS Chang ORDER BY 1; GO/* ⽅法⼆: 使⽤SQL Server 2005 独有的RANK() OVER () 语法*/ SELECT RANK() OVER (ORDER BY 客户编号 DESC) AS 序号, 客户编号, 公司名称 FROM 客户; GO/* ⽅法三*/ SELECT 序号= COUNT(*), LiMing.客户编号, LiMing.公司名称 FROM 客户 AS LiMing, 客户AS Chang WHERE LiMing.客户编号>= Chang.客户编号 GROUP BY LiMing.客户编号, LiMing.公司名称 ORDER BY 序号; GO/* ⽅法四建⽴⼀个「⾃动编号」的字段,然后将数据新增⾄⼀个区域性暂存数据表,然后由该区域性暂存数据表中,将数据选取出来,最后删除该区域性暂存数据表 */ SELECT 序号= IDENTITY(INT,1,1), 管道, 程序语⾔, 讲师, 资历 INTO #LiMing FROM 问券调查⼀; GO SELECT * FROM #LiMing; GO DROP TABLE #LiMing; GO/* ⽅法五使⽤ SQL Server 2005 独有的ROW_NUMBER() OVER () 语法搭配 CTE (⼀般数据表表达式,就是 WITH 那段语法)选取序号2 ~ 4 的数据 */ WITH 排序后的图书 AS (SELECT ROW_NUMBER() OVER (ORDER BY 客户编号 DESC) AS 序号, 客户编号, 公司名称FROM 客户) SELECT * FROM 排序后的图书 WHERE 序号 BETWEEN 2 AND 4; GO------------分页使⽤---------------------------SELECT RANK() OVER (ORDER BY id asc) AS no,* into #temp FROM Bbs_reply select * from #temp where no between 1 and 100 drop table #temp。
利用"SQL"语句自动生成序号的两种方式SQL Server2005数据库中利用SQL语句自动生成序号:1.首先,我们来介绍第一种方式:◆查询的SQL语句如下:◆运行的结果:2.最后,我们来介绍第二种方式:在我们利用这种方式生成自动序号时,Test_Table必须在数据库中不能存在,因为在执行这些SQL语句的时后自动会创建表。
以下为实现SQL server中按年月日生成日期型自增编码的sql脚本:/** 测试表*/CREATE TABLE [dbo].[CustomIDTest] ([ID] [int] NOT NULL ,[Code] [char] (8) NOT NULL)/**//** 功能:按 YYYYxxxx 格式生成目标年份的最大编码,数据类型为 CHAR(8)* 说明:特定表范围内有效* 未处理溢出情况(当表中某年值已达到YYYY9999)*/CREATE FUNCTION dbo.GenCustomCode(@Year INT)RETURNS CHAR(8)ASBEGINDECLARE@Code CHAR(8),@MinCodeInYear CHAR(8),@MaxCodeInYear CHAR(8)SELECT @MinCodeInYear = CONVERT(CHAR(4), @Year) + '0001', @MaxCodeInYear = CONVERT(CHAR(4), @Year) + '9999'SELECT @Code = MAX(Code) FROM CustomIDTest WHERE Code >= @MinCodeInYear AND Code <= @MaxCodeInYearIF @Code IS NOT NULL AND @Year = CONVERT(INT, SUBSTRING(@Code, 1, 4)) /**//*IF @Code = @MaxCodeInYear 溢出处理*/SET @Code = CONVERT(INT, @Code) + 1ELSESET @Code = @MinCodeInYearRETURN @CodeEND/**//** 功能:按 YYYYxxxx 格式生成目标年份的最大ID,数据类型为 INT* 说明:特定表范围内有效* 未处理溢出情况(当表中某年值已达到YYYY9999)*/CREATE FUNCTION dbo.GenCustomID(@Year INT)RETURNS INTASBEGINDECLARE@ID INT,@MinIDInYear INT,@MaxIDInYear INTSELECT @MinIDInYear = @Year*10000 + 1, @MaxIDInYear = @Year*10000 + 9999SELECT @ID = MAX(ID) FROM CustomIDTest WHERE ID >= @MinIDInYear AND ID <= @MaxIDInYearIF @ID IS NOT NULL AND @Year = @ID/10000/**//*IF @ID = @MaxIDInYear 溢出处理*/SET @ID = @ID + 1ELSESET @ID = @MinIDInYearRETURN @IDEND-- 测试-- 自定义年份内自增INSERT INTO CustomIDTest([ID], [Code])SELECT dbo.GenCustomID(DatePart(YY, DATEADD(YY, -1, GetDate()))), dbo.GenCustomCode(DatePart(YY, DATEADD(YY, -1, GetDate())))UNIONSELECT dbo.GenCustomID(DatePart(YY, GetDate())), dbo.GenCustomCode(DatePart(YY, GetDate()))UNIONSELECT dbo.GenCustomID(DatePart(YY, DATEADD(YY, 1, GetDate()))), dbo.GenCustomCode(DatePart(YY, DATEADD(YY, 1, GetDate())))SELECT * FROM CustomIDTest结果ID Code----------- --------20060001 2006000120060002 2006000220060003 2006000320060004 2006000420070001 2007000120070002 2007000220070003 2007000320070004 2007000420080001 2008000120080002 2008000220080003 2008000320080004 20080004说明:1、对于此示例,一年内最大增量只有,9999,需要考虑溢出如何处理,此版本未处理2、因此,根据实际需求,我们可以选择以“天”为编码前缀,并且扩大自增部分长度,避免溢出,3、当然此时得考虑,使用 INT 型长度是否足够4、此版本自定义函数,使用传入年份参数5、若欲始终使用当前系统日期,而不显示指定年份,则需要建立一视图来获取当前日期(因SQLServer中标量函数,不能使用 GetDate() 这样的非标量函数)详细讲解有关获取当月天数的实用技巧获取当月天数的实用技巧:以下是引用片段:分析如下:以下是引用片段:以下是引用片段:5. SYBASESELECT TOP N * FROM TABLE16. mysql:select * from table_name limit N为什么SQL不许在视图定义ORDER BY子句发布时间:2007.08.03 05:01来源:赛迪网作者:luoyingshu 问:为什么SQL Server不允许在视图定义使用ORDER BY子句?答: SQL Server之所以不允许在视图定义中使用ORDER BY子句是为了遵守ANSI SQL-92标准。
sql结果增加序号的方法SQL是一种用于管理和操作数据库的编程语言。
在处理数据库中的查询结果时,有时需要为每一行结果添加序号。
以下是几种常见的方法来实现在SQL结果中增加序号的方法。
1. 使用ROW_NUMBER()函数:ROW_NUMBER()函数是一个用于给查询结果中的每一行分配唯一递增序号的窗口函数。
以下是一个示例代码,演示如何使用ROW_NUMBER()函数添加序号列。
```SELECT ROW_NUMBER() OVER (ORDER BY column_name) AS RowNumber, column1, column2, ...FROM table_name```在上述代码中,column_name是用于排序的列名,table_name是要查询的表名。
通过将ROW_NUMBER()函数与OVER子句结合使用,可以为每一行结果创建一个名为RowNumber的序号列。
2. 使用IDENTITY列:IDENTITY列是一种特殊的列类型,用于自动为表中的每一行分配唯一的递增值。
以下是一个示例代码,演示如何在创建表时添加IDENTITY列。
```CREATE TABLE table_name(Id int IDENTITY(1,1),column1 data_type,column2 data_type,...)```在上述代码中,Id列将作为IDENTITY列,并通过指定初始值为1和增量为1来自动为表中的每一行设置唯一的递增值。
3. 使用变量和UPDATE语句:如果您已经查询了一个没有序号的结果集,并且希望在后续操作中添加序号,可以使用变量和UPDATE语句来实现。
以下是一个示例代码,演示如何在现有表中添加序号列。
```DECLARE @RowNumber int = 1UPDATE table_nameSET column_name = @RowNumber, @RowNumber = @RowNumber + 1```在上述代码中,table_name是要更新的表名,column_name是要添加序号的列名。
Oracle⾃动⽣成编号(实现sqlserver⾃增长字段)在access中有⾃动编号的数据类型,MSSQL和MYSQL也都有⾃动增长的数据类型,插⼊记录时不⽤操作此字段,会⾃动获得数据值,⽽oracle没有⾃动增长的数据类型,我们需要建⽴⼀个⾃动增长的序列号,插⼊记录时要把序列号的下⼀个值赋于此字段,可以预见的是,有此功能,我们可以把数据从ACCESS、MSSQL或MYSQL迁移到oracle了!create sequence type_id increment by 1 start with 1;这句中,type_id为序列号的名称,每次增长为1,起始序号为1。
如果要删除序列,⽤drop sequence 序列名就可以了!!序列可以保证多个⽤户对同⼀张表进⾏操作时⽣成唯⼀的整数,利⽤序列可以⾃动⽣成主关键字,序列只存在于数据字典中.CREATE SEQUENCE sequence[INCREMENT BY n][START WITH n][{MAXVALUE n|NOMAXVALUE}][{MINVALUE n|NOMINVALUE}][{CYCLE |NOCYCLE}][{CACHE n|NOCACHE}];INCREMENT BY--指定步长START WITH--指定初始值MAXVALUE--定义序列⽣成的最⼤编号.默认的MAXVALUE就是NOMAXVALUE,对于递增序列为10^27,对于递减序列为-1MINVALUE--定义序列的最⼩编号,默认的MINVALUE为NOMINVALUE,对于递增序列为1,递减序列为-10^26.CYCLE--配置序列在达到界限值时重复编号NOCYCLE--达到界限值时不重复编号,这是默认值,当你试图⽣成MAXVALUE+1时将返回异常.CACHE--定义在内存中保留的序列编号块的⼤⼩,默认值为20.NOCACHE--强制数据词典对于⽣成的每个序列编号进⾏更新,保证在⽣成的编号中没有空缺,但这样会降低性能.⽣成⼀个序列CREATE SEQUENCE dept_deptid_seqINCREAMENT BY 10START WITH 120MAXVALUE 9999NOCACHENOCYCLE;//如果是⽤来⽣成主键值的话,不要⽤CYCLE选项,⽽且命名序列时最好能体现它的潜在⽤途以便于理解.确认序列SELECT sequence_name,min_value,max_value,increament_by,last_numberFROM user_sequences;//如果你指定了NOCACHE选项,那么LAST_NUMBER列将显⽰下⼀可⽤的序列号.使⽤NEXTVAL可以访问序列中的下⼀个编号,但问题常常出现在会话初始序列之前查询其当前序列号CURRVALCREATE SEQUENCE emp_seqNOMAXVALUENOCYCLE;然后查询SELECT emp_seq.currvalFROM dual;将返回错误,问题就在于你视图引⽤CURRVAL之前,在你的会话中并没有使⽤NEXTVAL先初始化此序列.SELECT emp_seq.nextvalFROM dual;这样再查询CURRVAL就不会出错了.使⽤序列INSERT INTO departments(department_id,department_name,location_id)VALUES (dept_deptid_seq.NEXTVAL,'Support',2500);对序列进⾏缓冲存储可以提⾼性能,因为这样就不必对每个⽣成的编号都更新数据字典表,只需要对每⼀组编号进⾏更新即可.这样,在我们查询NEXTVAL时就直接从缓冲中提取,速度将快很多,但是进⾏序列缓冲带来的负⾯影响就是当数据库被回滚时,⽐如说系统崩溃,⼿动ROLLBACK 数据时,在缓冲中存储的序列值将会丢失,这也就是为什么会出现空缺(GAPS),如果⽣成序列时指定的是NOCACHE,那么可以在USER_SEQUENCES表⾥查询下⼀个可⽤的序列号值,这个查询并不会产⽣增加序列值的动作.修改序列ALTER SEQUENCE dept_deptid_seqINCREMENT BY 20MAXVALUE 999999NOCACHENOCYCLE;规则:>必须为序列的所有者或者拥有ALTER特权>修改对于以后的序列号⽣效>序列必须是被删除然后重新⽣成(使所有相关的对象失效,并且失去相应的关联)>修改时还要满⾜些其他的验证条件,⽐如说新的MAXVALUE不可以⽐现在的序列号低删除序列DROP SEQUENCE dept_deptid_seq;>必须要时序列的所有者或者有DROP ANY SEQUENCE的权限索引索引是通过获取特定的⾏信息⽽与默认的全表扫描相⽐⼤⼤提⾼系统性能的数据结构.可是显式的⼿动建⽴,也可⼀由ORACLE⾃动⽣成,它们是与之索引的表相独⽴的,就是说,可以在任何时候建⽴或者删除索引⽽对基表或者其他索引⽆任何影响(当你删除表时,相关的索引将会被删除).有两种索引>唯⼀索引--当你定义了⼀列含有主键或者唯⼀键约束时将⾃动⽣成⼀个唯⼀索引(可以⼿动建⽴,但是推荐由ORACLE⾃动建⽴)>⾮唯⼀索引--当你⼿动为⼀个查询中的连接建⽴⼀个外键索引来加速查询速度时建⽴索引CREATE INDEX indexON table (column[,column]...);e.g.CREATE INDEX emp_last_name_idxON employees(last_name);何时使⽤索引>当⼀个列包含的数值范围较⼤时>当⼀列包含⼤量空值时>⼀个或者多个列经常⼀起在WHERE⼦句或者JOIN⼦句中使⽤时>表⾮常⼤,但是⼤多数的查询只要求检索少于2-4个百分点的⾏记录何时不该使⽤索引>表很⼩时>列并不经常作为查询中的条件使⽤时>⼤多数查询都检索多于4个百分点的⾏记录>表经常被更新>索引列被作为表达式的⼀部分引⽤索引虽然可以很⼤程度提⾼检索性能,但是越多的索引,意味着在DML操作之后ORACLE就将花越多的功夫去更新索引.所以,⼀定要适时使⽤,确认索引查询数据字典视图USER_INDEXES和USER_IND_COLUMNS可以检索到索引的相关信息SELECT ic.index_name,ic.column_name,ic.column_position col_pos,ix.uniquenessFROM user_indexes ix,user_ind_columns icWHERE ic.inde_name=ix.index_nameAND ic.table_name='EMPLOYEES';基于函数的索引CREATE INDEX upper_dept_name_idxON departments(UPPER(department_name));//但是如果想保证ORACLE使⽤索引⽽不是全表扫描就必须保证函数值⾮空,就是需要加个WHERE⼦句指定⾮空如SELECT *FROM employeesWHERE UPPER(last_name_ IS NOT NULLORDER BY UPPER(last_name);如果没有WHERE⼦句,则将会进⾏全表扫描⾮使⽤索引了.删除索引DROP INDEX index;//当你删除⼀个表时,索引和约束将会⾃动删除,但是视图和序列将会保留.同义词同义词经常⽤来通过为⼀个本地或者远程对象给定⼀个通⽤的名字来简化SQL.同义词可以指向⼀个表,视图,序列,过程,函数或者本地数据库中的包,或者通过⼀个数据库连接指向另⼀个数据库中的对象.公共同义词可供所有⽤户使⽤,⽽专⽤同义词则只能供其所有者或者获得了相关授权的帐户所有者使⽤.⽐如说SCOTT拥有表EMP,所有⽤户都使⽤⾃⼰的⽤户名登陆数据库,并且必须引⽤该表,即SCOTT.EMP,如果我们为其⽣成⼀个同义词EMP,每个对该表具有相关特权的⼈都可以简单地在⾃⼰的SQL或者PL/SQL语句中以EMP的形式来引⽤它,不需要再指出所有者了.CREATE [PUBLIC] SYNONYM synonymFOR object;e.g.CREATE SYNONYM d_sumFOR dept_sum_vu;DROP SYNONYM d_sum;CREATE PUBLIC SYNONYM deptFOR alice.departments;DROP PUBLIC SYNONYM dept;//仅仅数据库管理员可以删除公共同义词关于Oracle的序列(Sequence)使⽤序列是⼀数据库对象,利⽤它可⽣成唯⼀的整数。
sqlserver使用序列的方法SQL Server是一种关系型数据库管理系统(RDBMS),可以用于存储和管理大量的结构化数据。
在SQL Server中,序列是一种生成唯一数字值的对象。
它可以用于自动生成序列的值,例如订单号、员工ID 等。
接下来,我们将详细介绍如何在SQL Server中使用序列。
1.创建序列在SQL Server中,可以使用CREATE SEQUENCE语句来创建序列。
以下是创建序列的基本语法:CREATE SEQUENCE sequence_name[ AS [ built_in_integer_type | user-defined_integer_type ] ][ START WITH <constant> ][ INCREMENT BY <constant> ][ MINVALUE <constant> | NO MINVALUE ][ MAXVALUE <constant> | NO MAXVALUE ][ CYCLE | NO CYCLE ][ CACHE <constant> | NO CACHE ]其中,sequence_name是序列的名称,built_in_integer_type是SQL Server支持的整数类型,START WITH指定序列的起始值,INCREMENT BY指定序列的增量大小,MINVALUE和MAXVALUE分别指定序列的最小值和最大值,CYCLE表示当达到最大值时是否循环使用值,CACHE表示预先缓存的序列值的数量。
以下是一个创建序列的示例:CREATE SEQUENCE OrderSeqSTART WITH 1INCREMENT BY 1MINVALUE 1NO MAXVALUENO CYCLECACHE 10上述语句将创建一个名为OrderSeq的序列,并设置起始值为1,增量为1,最小值为1,最大值无限制,不循环使用值,同时缓存10个序列值。
利用"SQL"语句自动生成序号的两种方式
SQL Server2005数据库中利用SQL语句自动生成序号:
1.首先,我们来介绍第一种方式:
◆查询的SQL语句如下:
◆运行的结果:
2.最后,我们来介绍第二种方式:
在我们利用这种方式生成自动序号时,Test_Table必须在数据库中不能存在,因为在执行这些SQL语句的时后自动会创建表。
以下为实现SQL server中按年月日生成日期型自增编码的sql脚
本:
/*
* 测试表
*/
CREATE TABLE [dbo].[CustomIDTest] (
[ID] [int] NOT NULL ,
[Code] [char] (8) NOT NULL
)
/**//*
* 功能:按 YYYYxxxx 格式生成目标年份的最大编码,数据类型为 CHAR(8)
* 说明:特定表范围内有效
* 未处理溢出情况(当表中某年值已达到YYYY9999)
*/
CREATE FUNCTION dbo.GenCustomCode(
@Year INT
)
RETURNS CHAR(8)
AS
BEGIN
DECLARE
@Code CHAR(8),
@MinCodeInYear CHAR(8),
@MaxCodeInYear CHAR(8)
SELECT @MinCodeInYear = CONVERT(CHAR(4), @Year) + '0001', @MaxCodeInYear = CONVERT(CHAR(4), @Year) + '9999'
SELECT @Code = MAX(Code) FROM CustomIDTest WHERE Code >= @MinCodeInYear AND Code <= @MaxCodeInYear
IF @Code IS NOT NULL AND @Year = CONVERT(INT, SUBSTRING(@Code, 1, 4)) /**//*IF @Code = @MaxCodeInYear 溢出处理*/
SET @Code = CONVERT(INT, @Code) + 1
ELSE
SET @Code = @MinCodeInYear
RETURN @Code
END
/**//*
* 功能:按 YYYYxxxx 格式生成目标年份的最大ID,数据类型为 INT
* 说明:特定表范围内有效
* 未处理溢出情况(当表中某年值已达到YYYY9999)
*/
CREATE FUNCTION dbo.GenCustomID(
@Year INT
)
RETURNS INT
AS
BEGIN
DECLARE
@ID INT,
@MinIDInYear INT,
@MaxIDInYear INT
SELECT @MinIDInYear = @Year*10000 + 1, @MaxIDInYear = @Year*10000 + 9999
SELECT @ID = MAX(ID) FROM CustomIDTest WHERE ID >= @MinIDInYear AND ID <= @MaxIDInYear
IF @ID IS NOT NULL AND @Year = @ID/10000
/**//*IF @ID = @MaxIDInYear 溢出处理*/
SET @ID = @ID + 1
ELSE
SET @ID = @MinIDInYear
RETURN @ID
END
-- 测试
-- 自定义年份内自增
INSERT INTO CustomIDTest([ID], [Code])
SELECT dbo.GenCustomID(DatePart(YY, DATEADD(YY, -1, GetDate()))), dbo.GenCustomCode(DatePart(YY, DATEADD(YY, -1, GetDate())))
UNION
SELECT dbo.GenCustomID(DatePart(YY, GetDate())), dbo.GenCustomCode(DatePart(YY, GetDate()))
UNION
SELECT dbo.GenCustomID(DatePart(YY, DATEADD(YY, 1, GetDate()))), dbo.GenCustomCode(DatePart(YY, DATEADD(YY, 1, GetDate())))
SELECT * FROM CustomIDTest
结果
ID Code
----------- --------
20060001 20060001
20060002 20060002
20060003 20060003
20060004 20060004
20070001 20070001
20070002 20070002
20070003 20070003
20070004 20070004
20080001 20080001
20080002 20080002
20080003 20080003
20080004 20080004
说明:
1、对于此示例,一年内最大增量只有,9999,需要考虑溢出如何处理,此版本未处理
2、因此,根据实际需求,我们可以选择以“天”为编码前缀,并且扩大自增部分长度,避免溢出,
3、当然此时得考虑,使用 INT 型长度是否足够
4、此版本自定义函数,使用传入年份参数
5、若欲始终使用当前系统日期,而不显示指定年份,则需要建立一视图来获取当前日期(因SQLServer中标量函数,不能使用 GetDate() 这样的非标量函数)
详细讲解有关获取当月天数的实用技巧获取当月天数的实用技巧:
以下是引用片段:
分析如下:
以下是引用片段:
以下是引用片段:
5. SYBASE
SELECT TOP N * FROM TABLE1
6. mysql:
select * from table_name limit N
为什么SQL不许在视图定义ORDER BY子句
发布时间:2007.08.03 05:01来源:赛迪网作者:luoyingshu 问:为什么SQL Server不允许在视图定义使用ORDER BY子句?
答: SQL Server之所以不允许在视图定义中使用ORDER BY子句是为了遵守ANSI SQL-92标准。
因为对该标准的原理分析需要对结构化查询语言(SQL)的底层结构和它所基于的数学理论进行讨论,我们不能在这里对它进行充分的解释。
但是,如果你需要在视图中指定ORDER BY子句,可以考虑使用以下方法:
Microsoft在SQL Server 7.0中引入的TOP结构在同ORDER BY子句结合使用时是非常有用的。
只有在同TOP关键词结合使用时,SQL Server才支持在视图中使用ORDER BY 子句。
注意:TOP关键词是SQL Server对ANSI SQL-92标准的扩展。
一条SQL语句变得巨慢的原因及其解决方法
发布时间:2008.01.30 04:58来源:赛迪网作者:赵震
现象:一条SQL突然运行的特别慢。
出错原因:用户增加了一个条件member.site=test,造成连接的顺序变化了,原来的驱动表是uidTable(最多1024条记录),现在变成了member表做驱动(600W条)。
所以这条语句变的巨慢。
但是既然是外连接,为什么连接的顺序会改变呢?因为外连接的连接顺序不是由COST决定的,而是由连接的条件决定的。
发现执行计划如下:
为什么根本就没有执行外连接呢?问题出在member.site='test'这个条件上,因为对外连接的表加了条件,造成外连接失效。
改为member.site(+)='test'后,问题彻底解决。