利用"SQL"语句自动生成序号的两种方式

 

 

 

【赛迪网-IT技术报道】SQL Server2005数据库中利用SQL语句自动生成序号:

1.首先,我们来介绍第一种方式:

查询的SQL语句如下:

select row_number() over (order by name) as rowid, sysobjects.[name] from sysobjects
              
              

运行的结果:

rowid   name
              
              
1           all_columns
              
              
2           all_objects
              
              
3           all_parameters
              
              
4           all_sql_modules
              
              
5           all_views
              
              

2.最后,我们来介绍第二种方式:

在我们利用这种方式生成自动序号时,Test_Table必须在数据库中不能存在,因为在执行这些SQL语句的时后自动会创建表。

select id=IDENTITY(int,1,1), sysobjects.[name] as name into dbo.Test_Table from sysobjects
              
              

 

 

详细讲解有关获取当月天数的实用技巧

 

 

 

获取当月天数的实用技巧:

以下是引用片段:

select day(dateadd(mm,1,getdate())-day(getdate())) 
              
              
--获得当月天数
               
               

分析如下:

select getdate()  --当前日期
               
               

            
            
             
              
            
            
select day(getdate()) --目前第几天
               
               

            
            
             
              
            
            
select getdate()-day(getdate())   --上个月最后一天
               
               

            
            
             
              
            
            
select dateadd(mm,1,getdate())-day(getdate())  --加上一个月
               
               

            
            
             
              
            
            
select day(dateadd(mm,1,getdate())-day(getdate())) --获得当月天数
               
               

  

以下是引用片段:

<script language="VBScript">
              
              
Dim dt1, dt2
              
              
dt1 = Date
              
              
dt1 = CDate(Year(dt1) & "-" & Month(dt1) & "-1") ' 得到本月第一天
               
               
dt2 = DateAdd("m", 1, dt1) ' 得到上个月第一天
               
               
MsgBox DateDiff("d", dt1, dt2) ' 得到两个月的差
               
               
</script>
              
              

以下是引用片段:

<script language="jscript">
              
              
var dt = new Date(); //得到当前时间
               
               
dt = new Date(dt.getFullYear(), dt.getMonth() + 1, 0); //得到本月最后一天
               
               
alert(dt.getDate()); // 本月最后一天即为本月的天数
               
               
</script>
              
              

 

 

取一表前N条记录 各个数据库的不同SQL写法

从别处看到的,本人在用的是DB2,竟然都不一样……看来是不能说SQL,所有的数据库用起来都一样了。 $r2>;Q?Q  
&f.;ydLYt  
1. ORACLE
g -HN M[1]
 
SELECT * FROM TABLE1 WHERE ROWNUM<=N m16!oAV?s  
2. INFORMIX c tP'/79]  
SELECT FIRST N * FROM TABLE1 > /zA]/^X  
3. DB2
4R!W-B


5  
SELECT * ROW_NUMBER() OVER(ORDER BY COL1 DESC) AS ROWNUM WHERE ROWNUM<=
N bQaDIry'u  
DB2 lU)6}Q'  
SELECT COLUMN FROM TABLE FETCH FIRST N ROWS ONLY .+f)f?­W‑6  
4. SQL SERVER X.LTZfA{  
SELECT TOP N * FROM TABLE1 02btp&T4B  
5. SYBASE $d,_g  ~  
SELECT TOP N * FROM TABLE1 7SqsVbLk
 
 
6. mysql: Rb(_27T!vW  
select * from table_name limit N l;&!z;  
dLg#,ZGd

为什么SQL不许在视图定义ORDER BY子句

 

 

 

发布时间:2007.08.03 05:01     来源:赛迪网    作者:luoyingshu

 

问:为什么SQL Server不允许在视图定义使用ORDER BY子句?

答: SQL Server之所以不允许在视图定义中使用ORDER BY子句是为了遵守ANSI SQL-92标准。因为对该标准的原理分析需要对结构化查询语言(SQL)的底层结构和它所基于的数学理论进行讨论,我们不能在这里对它进行充分的解释。但是,如果你需要在视图中指定ORDER BY子句,可以考虑使用以下方法:

USE pubs
              
              
GO 
              
              

            
            
             
              
            
            
CREATE VIEW AuthorsByName
              
              
AS
              
              
SELECT TOP 100 PERCENT *
              
              
FROM authors 
              
              
ORDER BY au_lname, au_fname
              
              
GO
              
              

MicrosoftSQL Server 7.0中引入的TOP结构在同ORDER BY子句结合使用时是非常有用的。只有在同TOP关键词结合使用时,SQL Server才支持在视图中使用ORDER BY子句。

注意:TOP关键词是SQL ServerANSI SQL-92标准的扩展。

一条SQL语句变得巨慢的原因及其解决方法

 

 

 

发布时间:2008.01.30 04:58     来源:赛迪网    作者:赵震

 

现象:一条SQL突然运行的特别慢。

select uidTable.column_value, first_name||' '
              
              
||last_name, company, job_title, upper(member_level), 
              
              
upper(service_value)
              
              
from (select * from table(select cast(multiset
              
              
(select b from bbb)as Taaa) from dual)) uidTable,member
              
              
where uidTable.column_value = member.login_id(+) 
              
              
and member.site='alibaba' and member.site='test';
              
              

出错原因:用户增加了一个条件member.site=test,造成连接的顺序变化了,原来的驱动表是uidTable(最多1024条记录),现在变成了member表做驱动(600W条)。所以这条语句变的巨慢。

但是既然是外连接,为什么连接的顺序会改变呢?因为外连接的连接顺序不是由COST决定的,而是由连接的条件决定的。发现执行计划如下:

-------------------------------------------------------
              
              
| Id | Operation | Name | Rows | Bytes | Cost |
              
              
--------------------------------------------------------
              
              
| 0 | SELECT STATEMENT | | 1018 | 72278 | 8155 |
              
              
| 1 | NESTED LOOPS | | 1018 | 72278 | 8155 |
              
              
| 2 | VIEW | | 4072 | 69224 | 11 |
              
              
| 3 | COLLECTION ITERATOR SUBQUERY FETCH| | | | |
              
              
| 4 | TABLE ACCESS FULL | DUAL | 4072 | | 11 |
              
              
| 5 | TABLE ACCESS FULL | BBB | 41 | 287 | 2 |
              
              
| 6 | TABLE ACCESS BY INDEX ROWID | MEMBER | 1 | 54 | 2 |
              
              
|* 7 | INDEX UNIQUE SCAN | MEMBER_SITE_LID_PK | 4 | | 1 |
              
              
-------------------------------------------------
              
              

为什么根本就没有执行外连接呢?问题出在member.site='test'这个条件上,因为对外连接的表加了条件,造成外连接失效。改为member.site(+)='test'后,问题彻底解决。

---------------------------------------------------
              
              
| Id | Operation | Name | Rows | Bytes | Cost |
              
              
-----------------------------------------------------
              
              
| 0 | SELECT STATEMENT | | 1018 | 72278 | 8155 |
              
              
| 1 | NESTED LOOPS | | 1018 | 72278 | 8155 |
              
              
| 2 | VIEW | | 4072 | 69224 | 11 |
              
              
| 3 | COLLECTION ITERATOR SUBQUERY FETCH| | | | |
              
              
| 4 | TABLE ACCESS FULL | DUAL | 4072 | | 11 |
              
              
| 5 | TABLE ACCESS FULL | BBB | 41 | 287 | 2 |
              
              
| 6 | TABLE ACCESS BY INDEX ROWID | MEMBER | 1 | 54 | 2 |
              
              
|* 7 | INDEX UNIQUE SCAN | MEMBER_SITE_LID_PK | 4 | | 1 |
              
              
-----------------------------------------------------------
              
              

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值