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,所有的數據庫用起來都一樣”了。
1. ORACLE
SELECT * FROM TABLE1 WHERE ROWNUM<=N
2. INFORMIX
SELECT FIRST N * FROM TABLE1
3. DB2
5
SELECT * ROW_NUMBER() OVER(ORDER BY COL1 DESC) AS ROWNUM WHERE ROWNUM<=N
DB2
SELECT COLUMN FROM TABLE FETCH FIRST N ROWS ONLY
4. SQL SERVER
SELECT TOP N * FROM TABLE1
5. SYBASE
SELECT TOP N * FROM TABLE1
6. mysql:
select * from table_name limit N
發布時間: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 |
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突然運行的特別慢。
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 | ----------------------------------------------------------- |
|