在ADO使用SELECT語法六
作者:Eve Cole
更新時間:2009-05-30 19:54:23
子查詢
在一個SELECT、SELECT...INTO、INSERT...INTO、DELETE、或UPDATE 表達式中,可以包含SELECT表達式,這個SELECT表達式叫做子查詢(sub query)。
您可以使用三種語法建立子查詢:
表達式[ANY | ALL | SOME] (子查詢)
表達式[NOT] IN (子查詢)
[NOT] EXISTS (子查詢)
子查詢的一個SELECT表達式,與一般SELECT表達式的語法相同,必須包含在括號之中。
您可以使用子查詢來取代SELECT表達式的運算式,或在WHERE或HAVING子句中的運算式。
關鍵字ANY和SOME的意義相同,用來選擇任何符合子查詢的記錄的比較條件。譬如下例將回傳產品中單價大於訂單中任何數量大於100的記錄:
SELECT * FROM 產品
WHERE 單價> ANY
(SELECT 單價FROM 訂單
WHERE 數量> 100)
關鍵字ALL,用來選擇所有符合子查詢的記錄的比較條件。
如在上例將ANY改為ALL,將回傳產品中單價大於訂單中所有數量大於100的記錄。
關鍵字IN 述語來擷取在主查詢中且只有在子查詢之中包含相同值的某些記錄。下列範例會回傳以百分之25 或更高的折扣賣出的所有產品:
關鍵字IN,用來選擇在子查詢之中的記錄。譬如下例將返回訂單中數量> 100的記錄:
SELECT * FROM 產品
WHERE 產品代號IN
(SELECT 產品代號FROM 訂單
WHERE 數量> 100)
相反地,關鍵字NOT IN,用來選擇不在子查詢之中的記錄。
在true/false比較中,可以使用EXISTS關鍵字,來決定子查詢是否會傳回任何的記錄。
關鍵字ALL的ASP例子,譬如ASP程序rs24.asp如下,[SELECT 姓名,科目,分數From 考試Where 科目= '算術' and 分數>= All (SELECT 分數From 考試Where 科目='算術' and 姓名='張三')] 找出分數大於或等於張三的算術考試的算術記錄:
<%
Set conn1 = Server.CreateObject("ADODB.Connection")
conn1.Open "DBQ=" & Server.MapPath("ntopsamp.mdb") & ";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"
Set rs2 = Server.CreateObject("ADODB.Recordset")
SqlStr = "SELECT 姓名,科目,分數From 考試Where 科目= '算術' and 分數>= All (SELECT 分數From 考試Where 科目='算術' and 姓名='張三')"
rs2.Open SqlStr,conn1,1,1
Response.Write "<p>All高於張三算術所有分數"
Do while not rs2.EOF
Response.Write "<BR>" & rs2("姓名") & " " & rs2("科目") & " 分數: " & rs2("分數")
rs2.MoveNext
Loop
rs2.Close
%>
以上的ASP程式rs24.asp,在使用者端使用瀏覽器,瀏覽執行的結果,顯示分數大於或等於張三的算術考試的算術記錄。
Any
關鍵字ANY用來選擇符合子查詢的任何記錄的比較條件,譬如ASP程序rs24.asp如下,[SELECT 姓名,科目,分數From 考試Where 科目= '算術' and 分數>= Any (SELECT 分數From 考試Where科目='算術' and 姓名='張三')] 找出分數大於或等於張三任何算術分數的記錄:
<%
Set conn1 = Server.CreateObject("ADODB.Connection")
conn1.Open "DBQ=" & Server.MapPath("ntopsamp.mdb") & ";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"
Set rs2 = Server.CreateObject("ADODB.Recordset")
SqlStr = "SELECT 姓名,科目,分數From 考試Where 科目= '算術' and 分數>= Any (SELECT 分數From 考試Where 科目='算術' and 姓名='張三')"
rs2.Open SqlStr,conn1,1,1
Response.Write "<p>Any高於張三算術任何分數"
Do while not rs2.EOF
Response.Write "<BR>" & rs2("姓名") & " " & rs2("科目") & " 分數: " & rs2("分數")
rs2.MoveNext
Loop
rs2.Close %>
以上的ASP程式rs24.asp,在使用者端使用瀏覽器,瀏覽執行的結果,顯示分數大於或等於張三任何算術分數的記錄。
Some
關鍵字SOME和ANY的意義相同,用來選擇符合子查詢的任何記錄的比較條件,譬如ASP程序rs24.asp如下,[SELECT 姓名,科目,分數From 考試Where 科目= '算術' and 分數>= Some (SELECT 分數From 考試Where 科目='算術' and 姓名='張三')] 找出分數大於或等於張三任何算術分數的記錄:
<%
Set conn1 = Server.CreateObject("ADODB.Connection")
conn1.Open "DBQ=" & Server.MapPath("ntopsamp.mdb") & ";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"
Set rs2 = Server.CreateObject("ADODB.Recordset")
SqlStr = "SELECT 姓名,科目,分數From 考試Where 科目= '算術' and 分數>= Some (SELECT 分數From 考試Where 科目='算術' and 姓名='張三')"
rs2.Open SqlStr,conn1,1,1
Response.Write "<p>Some高於張三算術任何分數"
Do while not rs2.EOF
Response.Write "<BR>" & rs2("姓名") & " " & rs2("科目") & " 分數: " & rs2("分數")
rs2.MoveNext
Loop
rs2.Close
%>
以上的ASP程式rs24.asp,在使用者端使用瀏覽器,瀏覽執行的結果,顯示分數大於或等於張三任何算術分數的記錄。
Select...Into
Select...Into將查詢的結果,建立一個產生的表。
文法如下:
SELECT 字段1[,字段2[, ...]] INTO 新表格[IN 外部表]
FROM 表
新表格的名稱不可與現存表格的名稱相同,否則將會發生錯誤。
Select...Into所建立的新表,其欄位的資料類型及大小與所查詢的表相同。
讓我們來看一個於ASP程式當中使用這個SQL指令的範例。
譬如ASP程式rs9.asp如下,[Select * Into 電腦From 產品Where 種類= '電腦'] 將[產品] 表中所有[種類] 為[電腦] 的紀錄產生一個新的[電腦] 表:
<%
Set conn1 = Server.CreateObject("ADODB.Connection")
conn1.Open "DBQ="& Server.MapPath("ntopsamp.mdb") &";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"
sql = "Select * Into 電腦From 產品Where 種類= '電腦'"
Set a = conn1.Execute(sql)
Set rs3 = Server.CreateObject("ADODB.Recordset")
sql = "Select * from 電腦"
rs3.Open sql,conn1,1,1,1
%>
<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>
<TR>
<TD ALIGN=CENTER BGCOLOR="#800000"><FONT COLOR="#FFFFFF">代號</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#800000"><FONT COLOR="#FFFFFF">名稱</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#800000"><FONT COLOR="#FFFFFF">價</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#800000"><FONT COLOR="#FFFFFF">數量</FONT></TD>
</TR>
<% Do while not rs3.EOF %>
<TR>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("代號")%></TD>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("名稱")%></TD>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("價")%></TD>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("數量")%></TD>
</TR>
<%
rs3.MoveNext
Loop
rs3.Close
%>
</TABLE>
以上的ASP程式rs9.asp,在使用者端使用瀏覽器,瀏覽執行的結果,顯示新[電腦] 表格的記錄。