設為首頁收藏本站

 取回密碼
 註冊
搜尋
熱搜: Redump discuz
檢視: 262|回覆: 1

【轉貼】 ADO如何使用SELECT語法

[複製連結]
發表於 2002年1月8日 16:57:55 | 顯示全部內容 |閱讀模式
SELECT陳述式

接著,讓我們看看SELECT陳述式,SELECT用來在資料庫中尋找符合特定條件的資料記錄,語法如下:

SELECT [關鍵字] { * | 資料表名稱.* | [資料表名稱.]欄位名稱1 [AS 別名1] [, [資料表名稱.] 欄位名稱2 [AS 別名2] [, ...]]}
FROM 資料表運算式 [, ...] [IN 外部資料庫]
[WHERE... ]
[GROUP BY... ]
[HAVING... ]
[ORDER BY... ]
[WITH OWNERACCESS OPTION]

關鍵字:可以用來限制傳回之記錄的數量,可以設定為ALL、DISTINCT、DISTINCTROW 、或TOP。如果沒有指定述語,預設值為 ALL。
*:選取全部的欄位。
別名:代替在資料表中原有的欄位名稱。
資料表運算式:一個或多個以逗號分隔的資料表名稱。
外部資料庫:如果資料表不存在於目前的資料庫當中,須設定包含資料表運算式中資料表的資料庫名稱。
執行SELECT 陳述式,`並不會改變資料庫之中現有的資料。

一個 SELECT 陳述式的最基本語法是:

SELECT * FROM 資料表運算式

您可以使用星號(*)來選取資料表的全部欄位。譬如下例選取 [產品] 資料表中的全部欄位:

SELECT * FROM 產品

欄位名稱包含空格或標點符號時,須使用括號[ ]將它括在其中。例如:

SELECT [電腦 的產品]

如果在FROM子句中的欄位名稱中,包含多個的資料表中時,需在欄位名稱前加上資料表名稱和點(.)運算子,即 資料表名稱.欄位名稱。譬如下例選取 [產品] 資料表的 [價格] 欄位和 [訂單] 資料表的 [數量] 欄位:

SELECT 產品.價格, 訂單.數量

FROM 產品, 訂單

WHERE 產品.代號 = 訂單.代號

當您使用Recordset 物件時,Recordset並不認得rs(資料表名稱.欄位名稱) 格式,即rs(“產品.價格”)會發生錯誤,您必須使用AS來設定欄位名稱的別名。譬如:

SELECT 產品.價格 AS 價格, 訂單.數量AS 數量

FROM 產品, 訂單

WHERE 產品.代號 = 訂單.代號

如此就可以使用rs(“價格”) 和rs(“數量”),來讀取其欄位的資料。

與SELECT陳述式相關的語法:

關鍵字:ALL/ DISTINCT/ DISTINCTROW/ TOP。
WHERE:尋找FROM中的資料表符合特定條件的資料記錄。WHERE 可以使用下面的BETWEEN、LIKE、IN運算子:
Between...And:判斷陳述式的值是否落在指定的範圍之中。
Like:尋找相符合的關鍵字。
IN運算式:限定範圍。
NOT IN運算式:表示不屬於所指定的範圍。
ORDER BY子句:可以設定排序的欄位。
GROUP BY子句:將查詢的結果做群組。
HAVING子句:使用於SELECT 陳述式中,篩選已經GROUP BY群組的記錄。
Union:可以合併多組查詢的結果。
JOIN:連接組合兩個資料表中的欄位記錄。
子查詢(sub query):陳述式中,可以包括SELECT陳述式。
Select...Into:將查詢的結果,建立一個產生的資料表。
詳細介紹如下:

ALL/DISTINCT/DISTINCTROW/TOP關鍵字

使用SELECT查詢時,可以加上關鍵字,以選取所查詢的記錄。如下:

ALL:傳回所有的記錄。
DISTINCT:指定欄位中的記錄有重複時只傳回一筆,記錄不重複。
DISTINCTROW:指定欄位中的記錄有重複時都不傳回。
TOP:傳回前面幾筆或幾個百分比的記錄。
語法如下:

SELECT [ALL | DISTINCT | DISTINCTROW | [TOP n [PERCENT]]]
FROM 資料表

ALL傳回所有的記錄。不加關鍵字時,與加ALL的意義相同,將傳回所有的記錄。譬如下列兩個例子的執行結果相同,都從產品資料表中傳回所有的記錄:

SELECT ALL * FROM 產品

與以下的執行結果相同:

SELECT * FROM 產品

DISTINCT不選取指定欄位之中的重複資料。使用DISTINCT後,查詢的結果,列在SELECT DISTINCT後的每個欄位的資料值,若相同則只取一筆,換句話說,指定欄位的資料不會有重複的現象。例如,在產品資料表之中有一些產品名稱相同的產品,加上DISTINCT的SQL陳述式只會傳回一筆欄位為產品名稱資料相同的記錄:

SELECT DISTINCT 產品名稱 FROM 產品

如果您不加上DISTINCT,上例查詢將傳回數個包含相同產品名稱的記錄。

如果SELECT DISTINCT子句後指定數個欄位,查詢的結果,所有欄位的組合值不會有重複的現象。

DISTINCTROW則不傳回指定欄位所有重複的記錄。

TOP n [PERCENT] ,傳回前面幾筆或幾個百分比的記錄。排列的順序可以使用ORDER BY子句來指定。譬如找到成績前10名的學生姓名:

SELECT TOP 10 姓名
FROM 學生
ORDER BY 成績

如果您沒有包含ORDER BY子句,查詢將由學生資料表傳回任意的10個記錄。

TOP不在相同值間作選擇,如果第10及第11的成績是相同的,查詢將傳回11個記錄。

您可使用PERCENT來設定前面幾個百分比的記錄,譬如譬如找到成績前10%的學生姓名:

SELECT TOP 10 PERCENT 姓名
FROM 學生
ORDER BY 成績

讓我們看一個於ASP程式碼當中使用這個SQL指令的例子。

可以利用Distinct找出不重覆的記錄,譬如ASP程式碼rs7.asp如下,[Insert Into 產品(代號,名稱) Select Distinct 代號,名稱 From 產品 where 代號 ='C2000'] 使用Distinct與Insert Into新增代號為C2000的記錄:

<%

'Distinct 代號,名稱只判斷代號,名稱是否相同, 相同者只加一筆

sql = "Insert Into 產品(代號,名稱) Select Distinct 代號,名稱 From 產品 where 代號 ='C2000'"

Set a = conn1.Execute(sql)

Set rs3 = Server.CreateObject("ADODB.Recordset&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

sql = "Select * from 產品 where 代號 ='C2000'"

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("代號&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html%></TD>

<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("名稱&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html%></TD>

<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("價格&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html%></TD>

<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("數量&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html%></TD>

</TR>

<%

rs3.MoveNext

Loop

rs3.Close

%>

</TABLE>

WHERE

WHERE尋找FROM中的資料表符合特定條件的資料記錄,WHERE 使用於SELECT、UPDATE、或DELETE陳述式。

如果SELECT查詢中沒有指定WHERE子句,將傳回資料表中所有的資料。如果在SELECT查詢多個資料表,且沒有使用WHERE子句、或JOIN 子句的話,查詢結果為多個資料表資料的乘績。

WHERE設定特定的條件,譬如:

FROM 產品WHERE 分類 = '電腦':表示選擇 [分類] 為 [電腦] 的 [產品]。
WHERE 價格 Between 1000 And 5000:表示價格介於1000至5000之間 。
一個WHERE子句,最多可包含40個運算式,運算式之間由AND或OR等邏輯運算子相連結。

設定特定的條件時,依照欄位類型,前後加不同的符號,譬如:

文字:前後加單引號,譬如WHERE 分類 = '電腦'。
數字:前後不加符號,譬如WHERE 數量 > 100。
日期:前後加#號,譬如WHERE 日期 = #5/15/99#。
WHERE可以使用下面的BETWEEN、LIKE、IN運算子。

Between...And

Between...And判斷陳述式的值是否落在指定的範圍之中。語法為:

expr Between value1 And value2

表示如果expr的值介於value1和value2之間,則Between...And運算子會傳回True;否則它會傳回False。

您也可以加上邏輯運算 Not expr Between value1 And value2,來判斷相反的條件,即expr落在value1和 value 2的範圍之外。

如果expr、value1、或value2為Null時,則Between...And會傳回Null值。

您不能在 Between...And 運算子中使用萬用字元*,例如,您不能使用 100* 和 500* 來尋找介於1000至5000中的產品代號。

Like

Like尋找相符合的關鍵字。

Like跟隨一個運算式,列出所要比較的字串或字元字串文字。

在一運算式中,您可以使用 Like 運算子將一欄位資料和一字串運算式做一比較。您可以使用萬用字元*來找出相類似的資料,譬如Like "王*",則查詢會傳回所有欄位中以 [王] 做為開頭的資料。

Like後運算式可以使用的符號:

%:萬用字元,表示一個或多個字元,譬如LIKE jack% 將找到所有以jack為起頭的字串文字,LIKE %jack%則找到包括jack的字串文字。
_:一個字元的萬用字元,譬如LIKE jack_ 將找到如jack1、jacka等字串文字,LIKE _jack_ 則找到如ajackb、cjackf等字串文字。
[x-y]:指定字元範圍,譬如LIKE [a-c]jack 將找到如ajack1、bjack、cjack等字串文字。
[^x-y]:指定排除的字元範圍,譬如LIKE [^a-c]jack 將不會找到如ajack1、bjack、cjack等字串文字。
下例中,會得到以字母A做為開頭而其後接著介於B到G之間的任何字母和一個數字的資料:

Like "A[B-G]#"

IN

IN運算式,限定範圍。

語法為:

expr [Not] In(value1, value2,…)

其中expr為運算式欄位。value1, value2, …為指定的範圍清單。

例如,您可以使用In運算子,來指定學生必須居住的城市,為台北市、台中市、或高雄市:

SELECT *

FROM 學生

WHERE 城市 In ('台北市','台中市','高雄市')

讓我們看一個ASP程式碼使用這個SQL指令的例子。

我們可以利用IN子句決定範圍,譬如ASP程式碼rs24.asp如下,[SELECT 姓名,科目,分數 From 考試 Where 分數 In (SELECT 分數 From 考試 Where 分數>=60)],使用IN找出分數大於或等於60分的記錄:

<%

Set conn1 = Server.CreateObject("ADODB.Connection&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

conn1.Open "DBQ=" & Server.MapPath("ntopsamp.mdb&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & ";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"

Set rs2 = Server.CreateObject("ADODB.Recordset&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

SqlStr = "SELECT 姓名,科目,分數 From 考試 Where 分數 In (SELECT 分數 From 考試 Where 分數>=60)"

rs2.Open SqlStr,conn1,1,1

Response.Write "<p>In: 低於60分不算"

Do while not rs2.EOF

Response.Write "<BR>" & rs2("姓名&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & " " & rs2("科目&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & " 分數: " & rs2("分數&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

rs2.MoveNext

Loop

rs2.Close

%>

以上的 ASP程式碼rs24.asp,於用戶端使用瀏覽器,瀏覽執行的結果,顯示分數大於或等於60分的記錄。

NOT IN

NOT IN運算式,表示不屬於所指定的範圍。

讓我們看一個於ASP程式碼當中使用這個SQL指令的例子。

我們可以利用Not In子句決定不應顯示的記錄,譬如ASP程式碼rs24.asp如下,[SELECT 姓名,科目,分數 From 考試 Where 分數 Not In (SELECT 分數 From 考試 Where 分數>=60)],使用IN找出分數不大於或等於60分的記錄,即小於60分的記錄:

<%

Set conn1 = Server.CreateObject("ADODB.Connection&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

conn1.Open "DBQ=" & Server.MapPath("ntopsamp.mdb&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & ";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"

Set rs2 = Server.CreateObject("ADODB.Recordset&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

SqlStr = "SELECT 姓名,科目,分數 From 考試 Where 分數 Not In (SELECT 分數 From 考試 Where 分數>=60)"

rs2.Open SqlStr,conn1,1,1

Response.Write "<p>Not In: 高於60分不算"

Do while not rs2.EOF

Response.Write "<BR>" & rs2("姓名&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & " " & rs2("科目&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & " 分數: " & rs2("分數&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

rs2.MoveNext

Loop

rs2.Close

%>

以上的 ASP程式碼rs24.asp,於用戶端使用瀏覽器,瀏覽執行的結果,顯示分數不大於或等於60分的記錄

ORDER BY

ORDER BY子句,可以設定排序的欄位。

在一個SQL陳述式之中,ORDER BY子句通常放置於最後。

若要以遞減順序來進行排序(Z~A,9 ~0),須於您要遞減排序的每一欄位的尾部加DESC字。譬如:

SELECT 姓名

FROM 員工

ORDER BY 薪資 DESC, 年齡

表示[薪資] 欄位以遞減順序來進行排序,[年齡] 欄位以遞增順序來進行排序。

ORDER BY子句中排序的欄位,不可以包含MEMO欄位類型或OLE物件類型,否則會發生錯誤。

在ORDER BY子句之中包含多個的欄位時,首先以ORDER BY之後的第一個欄位來進行排序。然後,若在此欄位之中有相同的資料記錄,才會以列第二欄位來進行排序,依此類推。

GROUP BY

GROUP BY將查詢的結果做群組,語法如下:

SELECT fieldlist
FROM table
WHERE criteria
[GROUP BY groupfieldlist]

使用WHERE子句,可以設定不想要做群組的資料,而使用HAVING子句可以篩選已經群組之後的欄位。

不可以對MEMO欄位類型或OLE物件類型的欄位做群組,否則會發生錯誤。

譬如ASP程式碼rs22.asp如下,[SELECT 種類, Avg(價格) As 平均 From 產品 Group By 種類] 使用GROUP BY將查詢的結果做 [種類] 群組,統計各個種類群組來平均價格Avg(價格):

<%

Set conn1 = Server.CreateObject("ADODB.Connection&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

conn1.Open "DBQ=" & Server.MapPath("ntopsamp.mdb&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & ";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"

Set rs2 = Server.CreateObject("ADODB.Recordset&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

SqlStr = "SELECT 種類, Avg(價格) As 平均 From 產品 Group By 種類"

Response.Write "<p>Avg(價格)"

rs2.Open SqlStr,conn1,1,1

Do while not rs2.EOF

Response.Write "<BR>" & rs2("種類&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & ": " & rs2("平均&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

rs2.MoveNext

Loop

rs2.Close %>

以上的 ASP程式碼rs22.asp,於用戶端使用瀏覽器,瀏覽執行的結果,顯示依據 [種類] 群組來統計平均價格。

讓我們多看個例子,譬如ASP程式碼rs22.asp如下,[SELECT 種類, Sum(數量*價格) As 總計 From 產品 Group By 種類] 使用GROUP BY將查詢的結果做 [種類] 群組,統計各個種類群組的數量與價格相乘的總價Sum(數量*價格):

<%

Set conn1 = Server.CreateObject("ADODB.Connection&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

conn1.Open "DBQ=" & Server.MapPath("ntopsamp.mdb&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & ";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"

Set rs2 = Server.CreateObject("ADODB.Recordset&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

SqlStr = "SELECT 種類, Sum(數量*價格) As 總計 From 產品 Group By 種類"

rs2.Open SqlStr,conn1,1,1

Response.Write "<p>Sum(數量*價格)"

Do while not rs2.EOF

Response.Write "<BR>" & rs2("種類&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & ": " & rs2("總計&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

rs2.MoveNext

Loop

rs2.Close %>

以上的 ASP程式碼rs22.asp,於用戶端使用瀏覽器,瀏覽執行的結果,顯示依據 [種類] 群組來統計總價。

Groupfieldlist為用以群組的欄位名稱,最多為10個欄位。

在groupfieldlist中欄位名稱的順序,將決定群組層次,由最高至最低的層次來分組。

最後,譬如ASP程式碼rs22.asp如下,[SELECT 姓名,科目,Avg(分數) As 平均 From 考試 Group By 姓名,科目] 使用GROUP BY將查詢的結果做依據 [姓名] 和 [科目] 群組,統計各個群組的 [平均] 分數Avg(分數):

<%

Set conn1 = Server.CreateObject("ADODB.Connection&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

conn1.Open "DBQ=" & Server.MapPath("ntopsamp.mdb&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & ";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"

Set rs2 = Server.CreateObject("ADODB.Recordset&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

SqlStr = "SELECT 姓名,科目,Avg(分數) As 平均 From 考試 Group By 姓名,科目"

rs2.Open SqlStr,conn1,1,1

Response.Write "<p>Group By 姓名,科目"

Do while not rs2.EOF

Response.Write "<BR>" & rs2("姓名&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & " " & rs2("科目&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & " 平均: " & rs2("平均&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

rs2.MoveNext

Loop

rs2.Close

%>

以上的 ASP程式碼rs22.asp,於用戶端使用瀏覽器,瀏覽執行的結果,顯示依據 [姓名] 和 [科目] 群組來統計 [平均] 分數。

學會了嗎?

HAVING

HAVING使用於SELECT 陳述式中,篩選已經GROUP BY群組的記錄。在GROUP BY群組記錄後,HAVING將篩選與HAVING子句中條件相吻合的記錄。

語法如下:

SELECT fieldlist
FROM table
WHERE selectcriteria
GROUP BY groupfieldlist
[HAVING groupcriteria]

.groupcriteria表示決定應篩選的群組記錄。

HAVING與WHERE相類似,是用來決定選取哪些記錄。當使用GROUP BY來群組記錄後,HAVING會決定應顯示的記錄,譬如:

SELECT 產品名稱

FROM 產品

GROUP BY 分類

HAVING 單價 > 1000

一個HAVING子句最多可包含40個運算式,運算式之間將由AND或OR等邏輯運算子來連結。

讓我們看一個於ASP程式碼當中使用這個SQL指令的例子。

我們可以利用HAVING子句決定應顯示的記錄,譬如ASP程式碼rs23.asp如下,[SELECT 姓名,科目,Avg(分數) As 平均 From 考試 Group By 姓名,科目 Having Avg(分數) >=60],使用Having Avg(分數) >=60找出平均分數大於或等於60分的記錄:

<%

Set conn1 = Server.CreateObject("ADODB.Connection&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

conn1.Open "DBQ=" & Server.MapPath("ntopsamp.mdb&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & ";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"

Set rs2 = Server.CreateObject("ADODB.Recordset&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

SqlStr = "SELECT 姓名,科目,Avg(分數) As 平均 From 考試 Group By 姓名,科目 Having Avg(分數) >=60"

rs2.Open SqlStr,conn1,1,1

Response.Write "<p>Having Avg(分數) >=60"

Do while not rs2.EOF

Response.Write "<BR>" & rs2("姓名&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & " " & rs2("科目&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & " 平均: " & rs2("平均&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

rs2.MoveNext

Loop

rs2.Close

%>

以上的 ASP程式碼rs23.asp,於用戶端使用瀏覽器,瀏覽執行的結果,顯示找出平均分數大於或等於60分的記錄。

我們也可以利用HAVING子句找出重覆的記錄,譬如ASP程式碼rs23.asp如下,[SELECT 代號 From 產品 Group By 代號 Having Count(代號) > 1],使用Having Count(代號) > 1找出代號重覆的記錄:

<%

Set conn1 = Server.CreateObject("ADODB.Connection&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

conn1.Open "DBQ=" & Server.MapPath("ntopsamp.mdb&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & ";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"

Set rs2 = Server.CreateObject("ADODB.Recordset&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

SqlStr = "SELECT 代號 From 產品 Group By 代號 Having Count(代號) > 1"

rs2.Open SqlStr,conn1,1,1

Response.Write "<p>找出重覆Having Count(代號) > 1"

Do while not rs2.EOF

Response.Write "<BR>" & rs2("代號&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

rs2.MoveNext

Loop

rs2.Close

%>

以上的 ASP程式碼rs23.asp,於用戶端使用瀏覽器,瀏覽執行的結果,顯示代號重覆的記錄。

Union

Union可以合併多組查詢的結果。

語法如下:

查詢1 UNION [ALL] 查詢2 [UNION [ALL]查詢3 [ ... ]]

查詢為一個SELECT陳述式。

當您使用一個 UNION 運算時,不會傳回重複的記錄;若要傳回所有的記錄,您可以於UNION後加上ALL,加上ALL執行查詢的速度比較快。

在一個UNION運算中的所有查詢,欄位數目必須相同。欄位大小可以不同,欄位資料類型也可以不同。

只有在第一個SELECT陳述式中可使用別名,在其它SELECT陳述式中被省略。

可以在每一個SELECT陳述式中使用GROUP BY或HAVING子句,以群組查詢的結果。

可以在最後一個SELECT陳述式使用ORDER BY 子句,以指定查詢的結果的排列順序。

讓我們看一個於ASP程式碼當中使用這個SQL指令的例子。

可以利用Union合併兩組查詢的結果,譬如ASP程式碼rs25.asp如下,[(SELECT 姓名,科目,分數 From 考試 Where 科目='算術' and 姓名='林志願') Union (SELECT 姓名,科目,分數 From 考試 Where 科目='算術' and 姓名='張三')],使用Union合併兩組SELECT查詢的結果,一組為查詢林志願的算術成績記錄,另一組查詢張三的算術成績記錄:

<%

Set conn1 = Server.CreateObject("ADODB.Connection&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

conn1.Open "DBQ=" & Server.MapPath("ntopsamp.mdb&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & ";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"

Set rs2 = Server.CreateObject("ADODB.Recordset&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

SqlStr = "(SELECT 姓名,科目,分數 From 考試 Where 科目='算術' and 姓名='林志願') Union (SELECT 姓名,科目,分數 From 考試 Where 科目='算術' and 姓名='張三')"

rs2.Open SqlStr,conn1,1,1

Response.Write "<p>Union"

Do while not rs2.EOF

Response.Write "<BR>" & rs2("姓名&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & " " & rs2("科目&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & " 分數: " & rs2("分數&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

rs2.MoveNext

Loop

rs2.Close

%>

以上的 ASP程式碼rs25.asp,於用戶端使用瀏覽器,瀏覽執行的結果,顯示林志願和張三的算術分數記錄。

Join

JOIN連接組合兩個資料表中的欄位記錄,包括三種:

INNER JOIN運算式:連接組合兩個資料表中的欄位記錄。
LEFT JOIN運算式:連接組合兩個資料表中的欄位記錄,並將包含了LEFT JOIN左邊資料表中的全部記錄。
RIGHT JOIN運算式:連接組合兩個資料表中的欄位記錄,並將包含了RIGHT JOIN右邊資料表中的全部記錄。
INNER JOIN設定兩個資料表相關連的運算式,以連接組合兩個資料表中的欄位記錄。

INNER JOIN語法如下:

FROM 資料表1 INNER JOIN 資料表2 ON 資料表1.欄位1 比較運算子 資料表2.欄位2

兩個資料表連接的欄位,譬如 [資料表1.欄位1=資料表2.欄位2],必須具有相同的欄位類型,但是欄位名稱不需要相同。

例如,自動編號欄位類型可以連接Long 的欄位類型,但是單精準數欄位類型不能連接倍精準數的欄位類型。

比較運算子可為=、<、>、<=、>=、或<>。

JOIN連接的欄位,不可以包含MEMO欄位類型或OLE物件類型,否則會發生錯誤。

在一個JOIN陳述式中,可以連結多個ON子句:

SELECT fields
FROM 資料表1 INNER JOIN 資料表2
ON 資料表1.欄位1 比較運算子 資料表2.欄位1 AND
ON 資料表1.欄位2 比較運算子 資料表2.欄位2) OR
ON 資料表1.欄位3 比較運算子 資料表2.欄位3)

JOIN陳述式中,可以為巢狀式:

SELECT fields
FROM 資料表1 INNER JOIN
(資料表2 INNER JOIN [( ]資料表3
[INNER JOIN [( ] 資料表x [INNER JOIN ...)]
ON 資料表3.欄位3 比較運算子 資料表x.欄位x)]
ON 資料表2.欄位2 比較運算子 資料表3.欄位3)
ON 資料表1.欄位1 比較運算子 資料表2.欄位2

在一個INNER JOIN中,可以包括巢狀式的LEFT JOIN或RIGHT JOIN,但是在一個LEFT JOIN或RIGHT JOIN中不能包括巢狀式的INNER JOIN。

讓我們看一個於ASP程式碼當中使用這個SQL指令的例子。

可以利用Inner Join...On組合兩個資料表中的記錄,譬如ASP程式碼rs26.asp如下,[Select 銷售.代號, 產品.名稱, 產品.價格, 銷售.數量 from 銷售 Inner Join 產品 On 產品.代號 = 銷售.代號],使用Inner Join...On設定兩個資料表相關連的運算式,組合兩個資料表中的記錄:

<%

Set conn1 = Server.CreateObject("ADODB.Connection&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

conn1.Open "DBQ="& Server.MapPath("ntopsamp.mdb&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html &";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"

'conn1.Open "driver={SQL Server};server=(Local);uid=sa;pwd=m565c7;database=NtopSamp"

Set rs3 = Server.CreateObject("ADODB.Recordset&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

sql = "Select 銷售.代號, 產品.名稱, 產品.價格, 銷售.數量 from 銷售 Inner Join 產品 On 產品.代號 = 銷售.代號"

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(0)%></TD>

<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3(1)%></TD>

<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3(2)%></TD>

<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3(3)%></TD>

</TR>

<%

rs3.MoveNext

Loop

rs3.Close

%>

</TABLE>

以上的 ASP程式碼rs26.asp,於用戶端使用瀏覽器,瀏覽執行的結果,顯示組合兩個資料表中的記錄,由於銷售資料表中並沒有名稱欄位和價格欄位,透過 [Inner Join 產品 On 產品.代號 = 銷售.代號] 找到產品資料表的名稱欄位和價格欄位之資料。

上例使用Inner Join的語法:

Select 銷售.代號, 產品.名稱, 產品.價格, 銷售.數量 from 銷售 Inner Join 產品 On 產品.代號 = 銷售.代號

結果與以下使用Where相同:

Select 銷售.代號, 產品.名稱, 產品.價格, 銷售.數量 from 銷售, 產品 Where 產品.代號 = 銷售.代號

LEFT JOIN/RIGHT JOIN

INNER JOIN連接組合兩個資料表中相關連的欄位記錄,為內部連接,您還可以使用:

使用LEFT JOIN運算:來建立一個左邊外部連接。LEFT JOIN除了取得兩個資料表中相關連的欄位記錄,並將包含了LEFT JOIN左邊資料表中的全部記錄,不管在右邊資料表中是否有相符的記錄。
使用RIGHT JOIN運算:建立一個右邊外部連接。RIGHT JOIN除了取得兩個資料表中相關連的欄位記錄,並將包含了RIGHT JOIN右邊資料表中的全部記錄,不管在左邊資料表中是否有相符的記錄。
例如,[銷售LEFT JOIN 產品] 可以選取所有的銷售記錄。[銷售RIGHT JOIN 產品] 可以選取所有的產品記錄。

譬如利用Left Join...On除了取得兩個資料表中相關連的欄位記錄,並包含了LEFT JOIN左邊資料表中的全部記錄, ASP程式碼rs26.asp如下,[Select 銷售.代號, 產品.名稱, 產品.價格, 銷售.數量 from 銷售 Left Join 產品 On 產品.代號 = 銷售.代號],使用Left Join包含了LEFT JOIN左邊銷售資料表中的全部記錄:

<%

Set conn1 = Server.CreateObject("ADODB.Connection&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

conn1.Open "DBQ="& Server.MapPath("ntopsamp.mdb&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html &";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"

'conn1.Open "driver={SQL Server};server=(Local);uid=sa;pwd=m565c7;database=NtopSamp"

Set rs3 = Server.CreateObject("ADODB.Recordset&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

sql = "Select 銷售.代號, 產品.名稱, 產品.價格, 銷售.數量 from 銷售 Left Join 產品 On 產品.代號 = 銷售.代號"

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(0)%></TD>

<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3(1)%></TD>

<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3(2)%></TD>

<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3(3)%></TD>

<%

rs3.MoveNext

Loop

rs3.Close

%>

</TABLE>

以上的ASP程式碼rs26.asp,於用戶端使用瀏覽器,瀏覽執行的結果,顯示包含了LEFT JOIN左邊銷售資料表中的全部記錄,由於銷售資料表中並沒有名稱欄位和價格欄位,代號4的銷售記錄,透過 [銷售 Left Join 產品 On 產品.代號 = 銷售.代號] 找到產品資料表的名稱欄位和價格欄位之資料,其他的代號並沒有找到名稱欄位和價格欄位之資料。

利用 Right Join...On除了取得兩個資料表中相關連的欄位記錄,並包含了RIGHT JOIN右邊資料表中的全部記錄,譬如ASP程式碼rs26.asp如下,[Select 銷售.代號, 產品.名稱, 產品.價格, 銷售.數量 from 銷售 Right Join 產品 On 產品.代號 = 銷售.代號],使用Right Join包含了RIGHT JOIN右邊產品資料表中的全部記錄:

<%

Set conn1 = Server.CreateObject("ADODB.Connection&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

conn1.Open "DBQ="& Server.MapPath("ntopsamp.mdb&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html &";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"

Set rs3 = Server.CreateObject("ADODB.Recordset&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

sql = "Select 銷售.代號, 產品.名稱, 產品.價格, 銷售.數量 from 銷售 Right Join 產品 On 產品.代號 = 銷售.代號"

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(0)%></TD>

<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3(1)%></TD>

<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3(2)%></TD>

<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3(3)%></TD>

<%

rs3.MoveNext

Loop

rs3.Close

%>

</TABLE>

以上的 ASP程式碼rs26.asp,於用戶端使用瀏覽器,瀏覽執行的結果,顯示包含了RIGHT JOIN右邊產品資料表中的全部記錄,由於產品資料表中並沒有數量欄位,代號4的產品記錄,透過 [銷售 Right Join 產品 On 產品.代號 = 銷售.代號] 找到銷售資料表的數量欄位之資料,其他的代號並沒有找到數量欄位之資料。

搞清楚了嗎?

子查詢

在一個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&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

conn1.Open "DBQ=" & Server.MapPath("ntopsamp.mdb&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & ";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"

Set rs2 = Server.CreateObject("ADODB.Recordset&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

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("姓名&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & " " & rs2("科目&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & " 分數: " & rs2("分數&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

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&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

conn1.Open "DBQ=" & Server.MapPath("ntopsamp.mdb&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & ";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"

Set rs2 = Server.CreateObject("ADODB.Recordset&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

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("姓名&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & " " & rs2("科目&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & " 分數: " & rs2("分數&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

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&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

conn1.Open "DBQ=" & Server.MapPath("ntopsamp.mdb&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & ";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"

Set rs2 = Server.CreateObject("ADODB.Recordset&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

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("姓名&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & " " & rs2("科目&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html & " 分數: " & rs2("分數&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

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&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

conn1.Open "DBQ="& Server.MapPath("ntopsamp.mdb&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html &";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"

'conn1.Open "driver={SQL Server};server=(Local);uid=sa;pwd=m565c7;database=NtopSamp"

sql = "Select * Into 電腦 From 產品 Where 種類 = '電腦'"

Set a = conn1.Execute(sql)

Set rs3 = Server.CreateObject("ADODB.Recordset&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html

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("代號&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html%></TD>

<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("名稱&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html%></TD>

<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("價格&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html%></TD>

<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("數量&quothttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html%></TD>

</TR>

<%

rs3.MoveNext

Loop

rs3.Close

%>

</TABLE>

以上的 ASP程式碼rs9.asp,於用戶端使用瀏覽器,瀏覽執行的結果,顯示新 [電腦] 資料表的記錄。

https://www.fishman.idv.tw/phpforum/thread-911-1-1.htmlhttps://www.fishman.idv.tw/phpforum/thread-911-1-1.htmlhttps://www.fishman.idv.tw/phpforum/thread-911-1-1.html
作者文章推薦
 作者| 發表於 2002年7月22日 23:26:17 | 顯示全部內容
以下引用由 Kevinching 在 2002年07月22日 下午 10:日 所發表的內容:
DISTINCTROW則不傳回指定欄位所有重複的記錄。
再SQL 2000 中試 好像不太行......

有釵h東西由Access搬到SQL2000上都執行不順...
好像是開啟方式...在Access裡較不嚴謹...
到了SQL2000上都要重改...
所以這兒可能還有問題..
我要回覆
懶得打字嗎?讓本助手協助你 【使用進階編輯器請點選右方進階模式】
您需要登入後才可以回覆 登入 | 註冊

本版積分規則

手機版|Archiver|漁家小舖

GMT+8, 2024年4月28日 03:34 , Processed in 0.400075 second(s), 21 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回覆 返回頂端 返回清單