sqlwithtemp
1. sql如何用with as的結果作where條件
示例代碼如下:
;with a as(select * from table_a),
b as (select * from a where id in(3,4,5))
select * from b
記得一定要有逗號間隔開兩個查詢,最後一個查詢前是沒有逗號的
2. 求救啊。下面存儲過程怎麼改,with temp as ()這里有錯誤
set @sql2='with temp as (select row_number() over (order by id) as inde, * from T_Books where '+@Field+' like ''% '+@Key+' %'' ) select * from temp where inde between (@pageIndex - 1)* @pageSize+1 and @pageIndex * '
將sql2 修改成這樣
3. SQL 查詢語句求助
--按學生分組統計選課數,按學生成績降序排名,然後過濾MSSQL2005+
Select學生,課程號,成績From
(
select*,COUNT(*)over(partitionby學生)ascnt,DENSE_RANK()over(partitionby學生orderby成績desc)
as名次from表
)swherecnt>=2and名次>1
--好像就這樣就可以了
Select學生,課程號,成績From
(
select*,DENSE_RANK()over(partitionby學生orderby成績desc)
as名次from表
)swhere名次>1
4. 問一下關於SQL語句的問題,with什麼意思,別的都是什麼意思,謝謝!!
with as 得到的數據是一次性使用的臨時數據。其中with 不是單獨一個意思,跟as組合起來後成為一個短語。
舉個例子:
with [abc] as(……)
select …… from [abc] where 條件A
select …… from [abc] where 條件B
以上語句在執行時,條件A的語句能取到數;取完數後 臨時數據[abc]就清除了;所以到條件B的語句就執行不下去了。
5. sql語句求解
select * from (
select * from table where to_date(year || month || day)<to_date(『2012』 || 『05』 || 『05』) order by to_date(year || month || day) desc)
where rownum = 1
最簡單的就是先排序,然後取得第一條,效率也就是這么樣了。
如果年月日都是數字的話,也可以用year*10000+month*100+day來比較,因為日期的大小和當成數字比較的結果是一樣的。
6. SQL數據去重後連接另外一表
createtable[表A]
([編號]varchar(10),
[姓名]varchar(20)
)
createtable[表B]
([編號]varchar(10),
[銷售]int
)
go
insertinto[表A]
values('001','A'),
('002','B'),
('002','B'),
('003','C')
go
insertinto[表B]
values('001',1000),
('002',750),
('003',11200)
go
print'方式一:------------'
selectt1.[編號],t1.[姓名],t2.[銷售]from
(selectdistinct[編號],[姓名]from[表A])ast1leftjoin
[表B]ast2ont1.[編號]=t2.[編號]
go
print'方式二:------------'
selectt1.[編號],t1.[姓名],t2.[銷售]from
(selectdistinct[編號],[姓名]from[表A])ast1,[表B]ast2wheret1.[編號]=t2.[編號]print'-------------'
truncatetable[表A]
droptable[表A]
truncatetable[表B]
droptable[表B]
go
希望能幫到你!
7. 一個棘手的SQL條件限制
createtableT
(
IDint,
AIDint,
BIDint
)
--Aid=1,BID=1,2在查詢結果中
insertintoTvalues(1,1,1)
insertintoTvalues(2,1,2)
insertintoTvalues(3,1,3)
insertintoTvalues(4,1,4)
--Aid=2隻有一條,不管Bid多少都在查詢結果中
insertintoTvalues(5,2,7)
--Aid=3,只有Bid=2在查詢結果中
insertintoTvalues(6,3,2)
insertintoTvalues(7,3,3)
insertintoTvalues(8,3,4)
--Aid=4,Bid=1在查詢結果中
insertintoTvalues(9,4,1)
insertintoTvalues(10,4,1)
SelectID,AID,BidFrom
(
Select*,COUNT(*)Over(PARTITIONbyAid)AsY
FromT
)sWhere(BIDin(1,2))orY=1
8. sql存儲過程用遞歸
表結構:
sale_area銷售分區表
PK#area_id
class_id
gonghao
prod_class產品分類表
PK#class_id
class_name
問題sql語句:
select distinct pa.class_id from prod_class As pa,prod_class As pb,sale_area where pb.class_id in(select sale_area.class_id from sale_area where sale_area.gonghao=<param>) and pa.class_id like pb.class_id||'%'
問題定義:
根據傳入的參數gonghao來確定對應的class_id集,然後遍歷這個class_id集,並「擴充」這個集合
要理解「擴充」必須知道class_id是這樣設等級:
0為最高級
|_01
| |_011
| |_012
|_02
|_011
|_012
那麼擁有等級0的話,所有的等級都應該可以訪問,擁有等級01的話,011、012也可以訪問。
這句sql的目的就是得到當前員工能訪問的所有產品分類及它的子集。
通過自連接的做法在Oracle里是對的,在DB2里就錯,原因在於DB2中謂詞like兩邊至少有一個是字元串,也就是說DB2不認為pb.class_id||'%'是字元串。
求解:
要完成上面的任務有什麼可替代的辦法或改進的地方,注意環境是DB2 UDB 7.2。
---------------------------------------------------------------
就是樹的問題。
使用公共表達式可以完成。
你在信息中心裏面按recusion去搜索,可以找到遞歸sql的寫法。
---------------------------------------------------------------
問題寫的很清楚,我喜歡!
如果要使用DB2的公共表達式建議你把
prod_class產品分類表結構改一下
PK#class_id
class_name
Parent_Class_id
sql語句如下:
with temp_class_id( class_id,class_name)
(
select pc.class_id,pc.class_name from prod_class pc
where pc.class_id in (select sale_area.class_id from sale_area
where sale_area.gonghao=<param>)
union
select pc.class_id,pc.class_name from prod_class pc,
temp_class_id tc
where pc.parent_id = tc.class_id)
select * from temp_class_id;
9. 如何用sql語句 把倆個欄位值加到一塊
SQL 2005 以上版本可用:
WITH temp AS
(
SELECT [login],
CASE WHEN LEFT([agent], 6) = 'Agent/' THEN SUBSTRING([agent], 7, LEN([agent]) - 6) ELSE [agent] END AS [agent]
FROM [table1]
)
SELECT SUM([login]), [agent]
FROM [temp]
GROUP BY [agent]
10. SQL資料庫中臨時表,臨時變數和with as關鍵詞創建「臨時表」的區別
SQL資料庫中數據處理時,有時候需要建立臨時表,將查詢後的結果集放到臨時表中,然後在針對這個數據進行操作。
創建「臨時表」(邏輯上的臨時表,可能不一定是資料庫的)的方法有一下幾種:
1.with tempTableName as方法(05之後出現):
with temptable as 其實並沒有建立臨時表,只是子查詢部分(subquery factoring),定義一個SQL片斷,該SQL片斷會被整個SQL語句所用到。有的時候,是為了讓SQL語句的可讀性更高些,也有可能是在UNION ALL的不同部分,作為提供數據的部分。特別對於UNION ALL比較有用。因為UNION ALL的每個部分可能相同,但是如果每個部分都去執行一遍的話,則成本太高,所以可以使用WITH AS短語,則只要執行一遍即可。
http://www.cnblogs.com/zhaowei303/articles/4204805.html