分享

SQL Select用法详解

 zhanglaiji 2011-05-31
SQL Select用法详解

在ADO使用SELECT语法一

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")

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("代号")%/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

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运算子。

******************************************************

ADO使用SELECT语法二

接上一篇文章:

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")

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 分数 In (SELECT 分数
From 考试 Where 分数=60)"

rs2.Open SqlStr,conn1,1,1

Response.Write "pIn: 低于60分不算"

Do while not rs2.EOF

Response.Write "BR" & rs2("姓名") & " " & rs2("科目") & " 分数: " &
rs2("分数")

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")

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 分数 Not In (SELECT 分
数 From 考试 Where 分数=60)"

rs2.Open SqlStr,conn1,1,1

Response.Write "pNot In: 高于60分不算"

Do while not rs2.EOF

Response.Write "BR" & rs2("姓名") & " " & rs2("科目") & " 分数: " &
rs2("分数")

rs2.MoveNext

Loop

rs2.Close

%

以上的 ASP程式rs24.asp,在用户端使用浏览器,浏览执行的结果,显示分数不大于或等于60分的记录

*****************************************************

在ADO使用SELECT语法三

接上一篇文章:

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")

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 种类, Avg(价格) As 平均 From 产品 Group By 种类"

Response.Write "pAvg(价格)"

rs2.Open SqlStr,conn1,1,1

Do while not rs2.EOF

Response.Write "BR" & rs2("种类") & ": " & rs2("平均")

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")

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 种类, Sum(数量*价格) As 总计 From 产品 Group By 种类"

rs2.Open SqlStr,conn1,1,1

Response.Write "pSum(数量*价格)"

Do while not rs2.EOF

Response.Write "BR" & rs2("种类") & ": " & rs2("总计")

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")

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 姓名,科目,Avg(分数) As 平均 From 考试 Group By 姓名,科目"

rs2.Open SqlStr,conn1,1,1

Response.Write "pGroup By 姓名,科目"

Do while not rs2.EOF

Response.Write "BR" & rs2("姓名") & " " & rs2("科目") & " 平均: " &
rs2("平均")

rs2.MoveNext

Loop

rs2.Close

%

以上的 ASP程式rs22.asp,在用户端使用浏览器,浏览执行的结果,显示依据 [姓名] 和 [科目] 来统计 [平均] 分数

2.6. 修改表
如果你建立了一个表后发现自己犯了一些错误,或者是应用的需求 发生了变化,那么你可以删除这个表然后重新建立它。但是如果这个 表已经填充了好多数据了,或者是该表已经被其它数据库对象参照, (比如一个外键约束) 那这可不是一个方便的选项。因此 PostgreSQL 提供了一族命令用于修改现有表。
你可以


增加字段,
删除字段,
增加约束,
删除约束,
修改默认值,
重命名字段,
重命名表。
所有这些动作都是用 ALTER TABLE命令执行的。
2.6.1. 增加字段
要增加一个字段,使用这条命令:
ALTER TABLE products ADD COLUMN description text;
新增的字段对于表中已经存在的行而言最初将先填充空值。
你也可以同时在该字段上定义约束,使用通常的语法:
ALTER TABLE products ADD COLUMN description text CHECK (description <> '');
一个新字段不能用非空约束,因为最初的时候该字段必须包含空值。 但是你可以稍后增加一个非空约束。同样,你也不能在一个新字段 上定义默认值。根据 SQL 标准的说明,这样需要对现存行的新 字段填充默认值,而这个特性还没有实现。但是你可以稍后调整 字段预设。
2.6.2. 删除字段
要删除一个字段,使用这个命令:
ALTER TABLE products DROP COLUMN description;

2.6.3. 增加约束
要增加一个约束,使用表约束语法。比如:
ALTER TABLE products ADD CHECK (name <> '');
ALTER TABLE products ADD CONSTRAINT some_name UNIQUE (product_no);
ALTER TABLE products ADD FOREIGN KEY (product_group_id) REFERENCES product_groups;
要增加一个不能写成表约束的非空约束,使用下面语法:
ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;

这个约束将立即进行检查,所以表在加入约束之前必须符合约束条件。
2.6.4. 删除约束
要删除一个约束,你需要知道它的名字。如果你给了它一个名字, 那么事情就好办了。否则系统会分配一个生成的名字,这样你就需要 把它找出来了。psql 的命令 \d tablename 在这儿可以帮忙﹔ 其它接口可能也提供了检查表的细节的方法。然后就是这条命令:
ALTER TABLE products DROP CONSTRAINT some_name;
除了非空约束外,所有约束类型都这么用。要删除非空类型,用
ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;
(要记得非空约束没有名字。)
2.6.5. 改变默认值
要给一个字段设定默认值,使用一个象下面这样的命令:
ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;
要删除默认值,用
ALTER TABLE products ALTER COLUMN price DROP DEFAULT;
这样相当于把预设设定为空,至少在 PostgreSQL里是这样的。 结果是,如果我们删除一个还没有定义的默认值不算错误,因为预设隐含就是空值。
2.6.6. 给字段改名字
重命名一个字段:
ALTER TABLE products RENAME COLUMN product_no TO product_number;

2.6.7. 给表改名字
To rename a table:
ALTER TABLE products RENAME TO items;

说明:复制表(只复制结构,源表名:a 新表名:b)

以下是代码片段:
SQL: select * into b from a where 1<>1

说明:拷贝表(拷贝数据,源表名:a 目标表名:b)

以下是代码片段:
SQL: insert into b(a, b, c) select d,e,f from b;

说明:显示文章、提交人和最后回复时间

以下是代码片段:
SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
说明:外连接查询(表名1:a 表名2:b)

以下是代码片段:
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
说明:日程安排提前五分钟提醒

以下是代码片段:
SQL:   select * from 日程安排 where datediff(’minute’,f开始时间,getdate())>5

说明:两张关联表,删除主表中已经在副表中没有的信息
SQL:

以下是代码片段:
delete from info where not exists ( select * from infobz where info.infid=infobz.infid  

说明:--
SQL:

以下是代码片段:
SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE
   FROM TABLE1,
     (SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE
         FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND
                 FROM TABLE2
               WHERE TO_CHAR(UPD_DATE,’YYYY/MM’) = TO_CHAR(SYSDATE, ’YYYY/MM’)) X,
             (SELECT NUM, UPD_DATE, STOCK_ONHAND
                 FROM TABLE2
               WHERE TO_CHAR(UPD_DATE,’YYYY/MM’) =
                     TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, ’YYYY/MM’) &brvbar;&brvbar; ’/01’,’YYYY/MM/DD’) - 1, ’YYYY/MM’)   Y,
         WHERE X.NUM = Y.NUM (+)
           AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) <> X.STOCK_ONHAND   B
WHERE A.NUM = B.NUM

说明:--
SQL:

以下是代码片段:
select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and 系名称=’"&strdepartmentname&"’ and 专业名称=’"&strprofessionname&"’ order by 性别,生源地,高考总成绩
说明:
从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源)
SQL:
以下是代码片段:
SELECT a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, ’yyyy’) AS telyear,
       SUM(decode(TO_CHAR(a.telfeedate, ’mm’), ’01’, a.factration)) AS JAN,
       SUM(decode(TO_CHAR(a.telfeedate, ’mm’), ’02’, a.factration)) AS FRI,
       SUM(decode(TO_CHAR(a.telfeedate, ’mm’), ’03’, a.factration)) AS MAR,
       SUM(decode(TO_CHAR(a.telfeedate, ’mm’), ’04’, a.factration)) AS APR,
       SUM(decode(TO_CHAR(a.telfeedate, ’mm’), ’05’, a.factration)) AS MAY,
       SUM(decode(TO_CHAR(a.telfeedate, ’mm’), ’06’, a.factration)) AS JUE,
       SUM(decode(TO_CHAR(a.telfeedate, ’mm’), ’07’, a.factration)) AS JUL,
       SUM(decode(TO_CHAR(a.telfeedate, ’mm’), ’08’, a.factration)) AS AGU,
       SUM(decode(TO_CHAR(a.telfeedate, ’mm’), ’09’, a.factration)) AS SEP,
       SUM(decode(TO_CHAR(a.telfeedate, ’mm’), ’10’, a.factration)) AS OCT,
       SUM(decode(TO_CHAR(a.telfeedate, ’mm’), ’11’, a.factration)) AS NOV,
       SUM(decode(TO_CHAR(a.telfeedate, ’mm’), ’12’, a.factration)) AS DEC
FROM (SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factration
         FROM TELFEESTAND a, TELFEE b
         WHERE a.tel = b.telfax) a
GROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, ’yyyy’)
说明:四表联查问题:

SQL:
以下是代码片段:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c   inner join d on a.a=d.d where .....
说明:得到表中最小的未使用的ID号
SQL:
以下是代码片段:
SELECT (CASE WHEN EXISTS(SELECT * FROM Handle b WHERE b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 END) as HandleID
FROM   Handle
WHERE NOT HandleID IN (SELECT a.HandleID - 1 FROM Handle a)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多