Menu
Woocommerce Menu

使用公用表达式可以让语句更加清晰简练.,一旦外部查询完成后

0 Comment


CTE 也叫公用表表明式和派生表非常相近 先定义三个USACusts的CTE  

公用表表达式(Common Table Expression,CTE卡塔尔国和派生表相通,都以伪造的表,不过比较于派生表,CTE具备局地优势和有益之处。

SQL Server 2005参考:CTE 公用表表明式

简介


    
对于SELECT查询语句来讲,常常状态下,为了使T-SQL代码尤其简明和可读,在二个查询中引用其它的结果集都以经过视图并不是子查询来打开说明的.不过,视图是作为系统对象存在数据库中,那对于结果集仅仅须要在积攒进度可能客商自定义函数中应用三遍的时候,使用视图就显得有个别浪费了.

    公用表表明式(Common Table Expression)是SQL SE昂CoraVE福特Explorer二〇〇五本子之后引进的叁脾个性.CTE能够作为是一个临时的结果集,能够在接下去的三个SELECT,INSERT,UPDATE,DELETE,ME牧马人GE语句中被反复引用。使用公用表明式能够让语句特别清晰洗练.

     除却,根据微软对CTE好处的描述,能够归纳为四点:

  •      能够定义递归公用表表达式(CTE)
  •      当无需将结果集作为视图被多个地点援引时,CTE能够使其更为简洁
  •     GROUP BY语句能够一贯效果于子查询所得的标量列
  •     可以在贰个言语中频仍援引公用表表明式(CTE)

 

WITH USACusts AS
(
  SELECT custid, companyname
  FROM Sales.Customers
  WHERE country = N'USA'
)
SELECT * FROM USACusts;

CTE有两类别型:非递归的CTE和递归CTE。

当三个查询定义须要被反复调用时,平常能够运用有的时候表、视图、派生表也许是子查询缓存结果集(或是查询定义卡塔尔,可是,假若那么些查询定义只为当前的拍卖服务,则上边的集聚方式都不太对劲:

公用表表明式(CTE)的概念


    公用表明式的定义非常轻便,只包涵三片段:

  1.   公用表表明式的名字(在WITH之后卡塔 尔(英语:State of Qatar)
  2.   所涉及的列名(可选卡塔 尔(英语:State of Qatar)
  3.   一个SELECT语句(紧跟AS之后)

    在MSDN中的原型:

WITH expression_name [ ( column_name [,...n] ) ] 

AS 

( CTE_query_definition ) 

 

  
依照是还是不是递归,能够将公用表(CTE卡塔 尔(阿拉伯语:قطر‎表明式分为递归公用表表明式和非递归公用表表明式.

 

with  ()  称为内部查询 
 与派生表相似,朝气蓬勃旦外界查询达成后,CTE就自行释放了

CTE是明媒正娶SQL的个性,归属表表达式的大器晚成种,MariaDB协理CTE,MySQL
8才最早扶助CTE。

A.       有时表会有额外的I/O开支;

非递归公用表表明式(CTE)


  
非递归公用表表明式(CTE卡塔 尔(阿拉伯语:قطر‎是询问结果唯有三回性再次回到一个结实集用于外界查询调用。并不在其定义的言辞中调用其自己的CTE

  
非递归公用表表明式(CTE卡塔 尔(英语:State of Qatar)的选拔办法和视图以及子查询一致

   譬喻一个简便的非递归公用表表达式:

  
图片 1

 

   当然,公用表说明式的补益之一是能够在接下去一条语句中反复援引:

 

  
图片 2

 

 

   前面作者直接重申“在接下去的一条语句中”,意味着只能接下去一条利用:

  
图片 3

 

  
由于CTE只可以在接下去一条语句中行使,因而,当要求接下去的一条语句中援用多少个CTE时,能够定义多个,中间用逗号分隔:

  
图片 4

 

CTE内部格局 正是地点代码所代表的主意  其实还只怕有黄金时代种外界形式

1.非递归CTE

CTE是运用WITH子句定义的,满含多个部分:CTE名称cte_name、定义CTE的查询语句inner_query_definition和引用CTE的表面查询语句outer_query_definition。

它的格式如下:

WITH cte_name1[(column_name_list)] AS (inner_query_definition_1)
   [,cte_name2[(column_name_list)] AS (inner_query_definition_2)]
[,...]
outer_query_definition

其中column_name_list指定inner_query_definition中的列列表名,如果不写该选拔,则供给确认保证在inner_query_definition中的列皆知名称且唯大器晚成,即对列名有二种命超方式:内部命名和表面命名。

注意,outer_quer_definition必得和CTE定义语句同期推行,因为CTE是一时半刻虚构表,唯有及时援引它,它的定义才是有意义的。

图片 5

 

上面语句是三个简短的CTE的用法。首先定义一张虚构表,也正是CTE,然后在外表查询中引用它。

CREATE OR REPLACE TABLE t(id INT NOT NULL PRIMARY KEY,sex CHAR(3),NAME CHAR(20));
INSERT INTO t VALUES (1,'nan','David'),(2,'nv','Mariah'),(3,'nv','gaoxiaofang'),(4,'nan','Jim'),
        (5,'nv','Selina'),(6,'nan','John'),(7,'nan','Monty'),(8,'nv','xiaofang');

# 定义CTE,顺便为每列重新命名,且使用ORDER BY子句
WITH nv_t(myid,mysex,myname) AS (
    SELECT * FROM t WHERE sex='nv' ORDER BY id DESC
)
# 使用CTE
SELECT * FROM nv_t;
+------+-------+-------------+
| myid | mysex | myname      |
+------+-------+-------------+
|    2 | nv    | Mariah      |
|    3 | nv    | gaoxiaofang |
|    5 | nv    | Selina      |
|    8 | nv    | xiaofang    |
+------+-------+-------------+

从结果中得以看出,在CTE的概念语句中使用O宝马X3DE路虎极光 BY子句是未有其他效能的。

在那间可以发掘,CTE和派生表须要满足的多少个同盟点:每一列要求有列名,满含总计列;列名必得唯风姿洒脱;无法利用O奥迪Q5DER
BY子句,除非采取了TOP关键字(规范SQL严刻依照无法动用OWranglerDER
BY的规规矩矩,但MySQL/MariaDB中允许)。不仅是CTE和派生表,别的表表明式(内联表值函数(sql
server才扶持)、视图)也都要满意那些标准。究其原因,表表达式的本色是表,固然它们是设想表,也应该满意产生表的规范。

单向,在关乎模型中,表对应的是涉嫌,表中的行对应的是事关模型中的元组,表中的字段(或列卡塔 尔(阿拉伯语:قطر‎对应的是关联合中学的属性。属性由三片段构成:属性的称号、属性的门类和属性值。因而要产生表,一定要保管属性的名目,即每一列皆知名称,且唯生龙活虎。

一面,关系模型是根据集结的,在集合中是不须要平稳的,因而不可能在多变表的时候让数据按序排列,即无法应用O奥迪Q3DER
BY子句。之所以在行使了TOP后能够行使OEscortDE科雷傲 BY子句,是因为那时的O奥德赛DER
BY只为TOP提供数据的逻辑提取服务,并不提供排序服务。举个例子利用OPRADODER
BY扶植TOP接受出前10行,但是那10行数据在多变表的时候不保障是各类的。

比较派生表,CTE有多少个优点:

1.往往引用:幸免重复书写。

2.每每概念:幸免派生表的嵌套难题。

3.方可运用递归CTE,达成递归查询。

例如:

# 多次引用,避免重复书写
WITH nv_t(myid,mysex,myname) AS (
    SELECT * FROM t WHERE sex='nv'
)
SELECT t1.*,t2.*
FROM nv_t t1 JOIN nv_t t2
WHERE t1.myid = t2.myid+1;

# 多次定义,避免派生表嵌套
WITH
nv_t1 AS (          /* 第一个CTE */
    SELECT * FROM t WHERE sex='nv' 
),
nv_t2 AS (          /* 第二个CTE */
    SELECT * FROM nv_t1 WHERE id>3
)
SELECT * FROM nv_t2;

风流罗曼蒂克旦地点的语句不行使CTE而接纳派生表的法子,则它等价于:

SELECT * FROM
(SELECT * FROM
(SELECT * FROM t WHERE sex='nv') AS nv_t1) AS nv_t2;

B.       视图是永世性的,不太相符用于一时定义的拍卖;

递归公用表表明式(CTE)


    递归公用表表明式很像派生表(Derived Tables
卡塔 尔(阿拉伯语:قطر‎,指的是在CTE内的语句中调用其自个儿的CTE.与派生表不相同的是,CTE能够在贰回定义数次进展派生递归.对于递归的定义,是指三个函数或是进程一向只怕直接的调用其本身,递归的简要概念图如下:

  
图片 6

    递归在C语言中完毕的一个独立例子是斐波那契数列:

long fib(int n)   
{   
     if (n==0) return 0;
   if (n==1) return 1;   
     if (n>1) return fib(n-1)+fib(n-2);
} 

  

  
上面C语言代码能够看出,要结成递归函数,需求两片段。第一片段是功底部分,重临固定值,也正是告诉程序哪一天开端递归。第二有的是循环部分,是函数或进程一贯可能直接调用本人举办递归.

 

  
对于递归公用表明式来讲,达成原理也是毫无二致的,相像须要在言辞中定义两部分:

  •    基本语句
  •    递归语句

   在SQL这两有个别通过UNION ALL连接结果集举办重返:

   比如:在AdventureWork中,作者想知道种种职工所处的层级,0是最高端

  
图片 7

  

 

 

 

   这么复杂的查询通过递归CTE变得这么文雅和简洁.那也是CTE最精锐的地点.

  
当然,越强盛的本事,就需求被限定.尽管使用不当的话,递归CTE或许会现出最为递归。进而大批量消耗SQL
Server的服务器财富.因此,SQL
Server提供了OPTION选项,能够设定最大的递归次数:

   依然地方十一分语句,约束了递归次数:

  
图片 8

   所提示的新闻:

  
图片 9

 

   那一个最大递归次数往往是基于数量所表示的现实性作业有关的,比方此处,借使公司层级最两只有2层.

 

WITH C(orderyear, custid) AS
(
  SELECT YEAR(orderdate), custid
  FROM Sales.Orders
)
SELECT orderyear, COUNT(DISTINCT custid) AS numcusts
FROM C
GROUP BY orderyear;
GO

C(orderyear, custid)  可以理解为 select orderyear, custid from C   指定返回你想要的列  不过个人感觉没什么用!

它和派生表相同 也可以在CTE中查询使用参数

DECLARE @empid AS INT = 3;

WITH C AS
(
  SELECT YEAR(orderdate) AS orderyear, custid
  FROM Sales.Orders
  WHERE empid = @empid
)
SELECT orderyear, COUNT(DISTINCT custid) AS numcusts
FROM C
GROUP BY orderyear;
GO

2.递归CTE

SQL语言是结构化查询语言,它的递归特性很倒霉。使用递归CTE可微微改正这一败笔。

公用表表明式(CTE)具有一个至关主要的独特之处,那正是力所能致引用其自己,进而创制递归CTE。递归CTE是一个双重推行起来CTE以回到数据子集直到获取完整结果集的公用表表达式。

当有个别查询援用递归CTE时,它即被叫做递归查询。递归查询普通用于重回分层数据,举个例子:显示某些团体图中的雇员或货品项目清单方案(此中父级付加物有四个或三个零部件,而那多少个组件大概还恐怕有子组件,大概是别的父级成品的构件)中的数据。

递归CTE能够大幅度地简化在SELECT、INSERT、UPDATE、DELETE或CREATE
VIEW语句中运作递归查询所需的代码。

相当于说,递归CTE通过援引我来贯彻。它会随处地重复查询每二次递归得到的子集,直到得到最后的结果。那使得它极度相符管理”树状结构”的数量或然有”档案的次序关系”的数目。

C.        派生表或子查询会大增加编写制定制SQL语句的繁琐,也就狂跌的可读性。

总结 


   
CTE是生机勃勃种非常清淡的留存。CTE所带来最大的低价是代码可读性的升官,那是各取所需代码的总得质量之意气风发。使用递归CTE能够进一层轻便欢快的用文雅简洁明了的措施贯彻复杂的询问。

概念三个CTE

2.1 语法

递归cte中包蕴三个或多个定位点成员,三个或多少个递归成员,最终二个定位点成员必需使用”union
[all]”(mariadb中的递归CTE只补助union
[all]聚拢算法)联合第贰个递归成员。

以下是单个定位点成员、单个递归成员的递归CTE语法:

with recursive cte_name as (
    select_statement_1       /* 该cte_body称为定位点成员 */
  union [all]
    cte_usage_statement      /* 此处引用cte自身,称为递归成员 */
)
outer_definition_statement    /* 对递归CTE的查询,称为递归查询 */

其中:

select_statement_1:称为”定位点成员“,那是递归cte中第豆蔻梢头施行的一些,也是递归成员伊始递归时的数额来源。

cte_usage_statement:称为”递归成员“,该语句中必得引用cte自个儿。它是递归cte中的确早先递归的地点,它首先从定位点成员处得到递归数据出自,然后和其他数据群集合起头递归,每递归一回都将递归咎果传递给下一个递归动作,不断重复地查询后,当最终查不出数据时才甘休递归。

outer_definition_statement:是对递归cte的询问,这一个查询称为”递归查询”。

(当然,可读性也是相持的,这里十分的少谈。卡塔 尔(阿拉伯语:قطر‎

WITH C1 AS
(
  SELECT YEAR(orderdate) AS orderyear, custid
  FROM Sales.Orders
),
C2 AS
(
  SELECT orderyear, COUNT(DISTINCT custid) AS numcusts
  FROM C1
  GROUP BY orderyear
)
SELECT orderyear, numcusts
FROM C2
WHERE numcusts > 70;

2.2 递归CTE示例(1)

举个最卓越的事例:族谱。

诸如,上面是一张族谱表

CREATE OR REPLACE TABLE fork(id INT NOT NULL UNIQUE,NAME CHAR(20),father INT,mother INT);
INSERT INTO fork VALUES
    (1,'chenyi',2,3),(2,'huagner',4,5),(3,'zhangsan',NULL,NULL),
    (4,'lisi',6,7),(5,'wangwu',8,9),(6,'zhaoliu',NULL,NULL),(7,'sunqi',NULL,NULL),
    (8,'songba',NULL,NULL),(9,'yangjiu',NULL,NULL);

MariaDB [test]> select * from fork;
+----+----------+--------+--------+
| id | name     | father | mother |
+----+----------+--------+--------+
|  1 | chenyi   |      2 |      3 |
|  2 | huagner  |      4 |      5 |
|  3 | zhangsan |   NULL |   NULL |
|  4 | lisi     |      6 |      7 |
|  5 | wangwu   |      8 |      9 |
|  6 | zhaoliu  |   NULL |   NULL |
|  7 | sunqi    |   NULL |   NULL |
|  8 | songba   |   NULL |   NULL |
|  9 | yangjiu  |   NULL |   NULL |
+----+----------+--------+--------+

该族谱表对应的结构图: 

图片 10

若是要找族谱中某一个人的父系,首先在定位点成员中得到要从什么人开头找,举例上海体育场面中从”陈意气风发”带头找。那么陈风度翩翩那几个记录正是首先个递归成员的数据源,将这些数额源联接族谱表,找到陈大器晚成的生父黄二,该结果将通过union子句结合到上叁个”陈风度翩翩”中。再一次对黄二递归,找到李四,再对李四递归找到赵六,对赵六递归后找不到下三个数码,所以那风流罗曼蒂克支行的递归结束。

递归cte的口舌如下:

WITH recursive fuxi AS (
    SELECT * FROM fork WHERE `name`='chenyi'
    UNION
    SELECT f.* FROM fork f JOIN fuxi a WHERE f.id=a.father
)
SELECT * FROM fuxi;

演变结果如下:

率先实施定位点部分的话语,获得定位点成员,即结果中的第大器晚成行结果集:

图片 11

依据该定位点成员,开头实践递归语句:

图片 12

递归时,依据f.id=a.father的口径进行筛选,拿到id=2的结果,该结果通过union和前边的数量整合起来,作为下一遍递归的数码源fuxi。

再拓宽第二遍递归:

图片 13

其三遍递归:

图片 14

由于第三回递归后,id=6的father值为null,由此第肆遍递归的结果为空,于是递归在第四遍现在甘休。 

SQL Server 二零零五 中新扩大了公用表表明式(CTE卡塔尔国来解决那样的主题材料,它是在脚下的select、

八个CTE用 , 隔断 通过with 内部存款和储蓄器 能够在外查询中再三援用

2.2 递归CTE示例(2)

该CTE示例主要目标是亲自过问切换递归时的字段名称。

举例,有多少个公共交通站点,它们之间的互通性如下图:

图片 15

对应的表为:

CREATE OR REPLACE TABLE bus_routes (src char(50), dst char(50));
INSERT INTO bus_routes VALUES 
  ('stopA','stopB'),('stopB','stopA'),('stopA','stopC'),('stopC','stopB'),('stopC','stopD');
MariaDB [test]> select * from bus_routes;
+-------+-------+
| src   | dst   |
+-------+-------+
| stopA | stopB |
| stopB | stopA |
| stopA | stopC |
| stopC | stopB |
| stopC | stopD |
+-------+-------+

要总计以stopA作为源点,能达到哪些站点的递归CTE如下:

WITH recursive dst_stop AS (
    SELECT src AS dst FROM bus_routes WHERE src='stopA'   /* note: src as dst */
    UNION
    SELECT b.dst FROM bus_routes b 
      JOIN dst_stop d 
    WHERE d.dst=b.src
)
SELECT * FROM dst_stop;

结果如下:

+-------+
| dst   |
+-------+
| stopA |
| stopB |
| stopC |
| stopD |
+-------+

率先实行一定点语句,拿到定位点成员stopA,字段名称叫dst。

再将定位点成员结果和bus_routes表联接进行第二遍递归,如下图:

图片 16

再张开第叁遍递归:

图片 17

再开展第一遍递归,但第一回递归进程中,stopD找不到相应的笔录,由此递归截止。 

insert、update、delete或是create view语句执行范围钦定义的偶尔结果集。CTE与派生表相近,具身体表面今后不存款和储蓄为对象,并且只在查询时期有效。与派生表的差别之处在于,CTE可自援用,还可在相符查询中援用多次。

WITH YearlyCount AS
(
  SELECT YEAR(orderdate) AS orderyear,
    COUNT(DISTINCT custid) AS numcusts
  FROM Sales.Orders
  GROUP BY YEAR(orderdate)
)
SELECT Cur.orderyear, 
  Cur.numcusts AS curnumcusts, Prv.numcusts AS prvnumcusts,
  Cur.numcusts - Prv.numcusts AS growth
FROM YearlyCount AS Cur
  LEFT OUTER JOIN YearlyCount AS Prv
    ON Cur.orderyear = Prv.orderyear + 1;

2.2 递归CTE示例(3)

依然是公共交通路径图:

图片 18

测算以stopA为源点,可以达到哪些站点,并交付路径图。比如: stopA–>stopC–>stopD 。

以下是递归CTE语句:

WITH recursive bus_path(bus_path,bus_dst) AS (
    SELECT src,src FROM bus_routes WHERE src='stopA'
    UNION
    SELECT CONCAT(b2.bus_path,'-->',b1.dst),b1.dst
    FROM bus_routes b1
      JOIN bus_path b2
    WHERE b2.bus_dst = b1.src AND LOCATE(b1.dst,b2.bus_path)=0
)
SELECT * FROM bus_path;

先是拿到源点stopA,再拿走它的目的stopB和stopC,并将源点到目的使用”–>”连接,即 concat(src,”–>”,”dst”) 。再依赖stopB和stopC,获取它们的靶子。stopC的靶子为stopD和stopB,stopB的对象为stopA。若是总是成功,那么路径为:

stopA-->stopB-->stopA   目标:stopA
stopA-->stopC-->stopD   目标:stopD
stopA-->stopC-->stopB   目标:stopB

如此会极度递归下去,由此我们要剖断什么日期甘休递归。判别的方法是指标差异意出以后路线中,只要出现,表明路线会再次计算。

与上述同类,能够拉长复杂T-SQL语句的可读性和可维护性,查询能够分成单独快、轻巧块、逻辑生成块,之后这个总结快能够变动更目迷五色的CTE,知道生成最后结果集。

可以须要在八个相似表结果做物理实例化  那样可以节约数不胜数查询时间
恐怕在不常表和表变量中固化内部查询结果

选用范围

递归CTE

CTE能够在函数、存款和储蓄进程、触发器或是视图中定义和接纳CTE。

递归CTE最少由多少个查询定义,起码贰个询问作为定位点成员,二个询问作为递归成员。

          同一时间从利用角度能够分成轻巧CTE和递归CTE:

递归成员是多少个援引CTE名称的查询
,在率先次调用递归成员,上二个结出集是由上三回递归成员调用再次来到的。
其实就和C# 方法写递归同样  重回上一个结实集 依次输出

(1卡塔 尔(阿拉伯语:قطر‎         简单CTE,你可知为叁个简易视图来采用;

   WITH    Emp
 AS ( SELECT  * FROM  dbo.dt_users
               WHERE  id=2
                UNION ALL  
                SELECT d.* FROM  Emp
                         INNER JOIN dbo.dt_users d ON d.agent_id = Emp.id
             )
    SELECT *
     FROM Emp 

(2卡塔 尔(英语:State of Qatar)         递归CTE,正是CTE能够引用小编,来创立递归的CTE,完毕递归查询(前期为促成递归查询必要动用有时表、游标等来完成卡塔尔。

在后面也写过 sql 语句的推行顺序 其实到  FROM Emp   时
就进展了节点第三遍递归  当大家递归到第一遍的时候 那个为奉行的sql
语句实在是哪些的啊

切实选拔到位前面包车型大巴本子示例。

   WITH    Emp
 AS ( SELECT  * FROM  dbo.dt_users
               WHERE  id=2
                UNION ALL  
                SELECT  * FROM  dbo.dt_users
               WHERE  id=3
                UNION ALL  
                SELECT  * FROM  dbo.dt_users
               WHERE  id=4
                UNION ALL  
                SELECT d.* FROM  Emp
                         INNER JOIN dbo.dt_users d ON d.agent_id = Emp.id
             )
    SELECT *
     FROM Emp 

语法:

大概明了能够把它当作两有个别

WITH cte_name ( column_name [,…n] )

SELECT  * FROM  dbo.dt_users
               WHERE  id=2

   SELECT d.* FROM  Emp
                         INNER JOIN dbo.dt_users d ON d.agent_id = Emp.id

AS

上有些的结果集 会积累成最终呈现的结果 下局地的结果集  正是下壹遍递归的
上部分结实集 依次拼接  就是以此递归最终的结果集 

(

下一些 在安详严整  认真看很有意思

   
CTE_query_definition –- Anchor member is
defined(定位定成员).

  SELECT d.* FROM  Emp

SELECT d.* FROM   dbo.dt_users d

    UNION ALL

from Emp 源数据来源于  d  在 on  d.agent_id = Emp.id 就是自连接 而 Emp.id
结果 来自哪里呢  正是上有的结出集
假如是第4回运维结果集正是上部分运转的结果 
 记住下有个别操作结果集都是近些日子的上有的结果集。

   
CTE_query_definition –- Recursive member is
defined referencing

默认情况下递归是100次 也可在 外部查询 指定递归次数 MAXRECURSION N 0~32767 次范围 MAXRECURSION 0 并不是0次实际上是递归次数无限制

cte_name(递归成员).

 

)

咱俩那边将其进度简述如下:

(1卡塔尔国         将CTE表明式拆分为定位点成员和递归成员

(2卡塔 尔(英语:State of Qatar)         运转定位点成员,创设第五个调用或规范结果(PRADO1卡塔 尔(英语:State of Qatar),递归的级数为i

(3卡塔 尔(英语:State of Qatar)         运转递归成员,将Havali作为输入,将Ri+1作为出口,i为递归级数,每将运维递归成员后,i加1.

(4卡塔 尔(阿拉伯语:قطر‎         重复步骤3,直到回到空集。

(5卡塔尔         再次来到结果集。那是对Highlander1到Ri+1进行union all的结果。

 

         使用CTE还可能有部分注意事项,能够参照Sql server联机丛书的”WITH common_table_expression” 部分剧情,同一时间还足以获得更加多的身体力行。

示例

首先大家创立叁个表Table, 只为示范使用,杜撰剧情

CREATE TABLE dept

(

    id INT PTiguanIMA传祺Y
KEY,
— 部门编号

    parent_id
INT,       —
所属单位的编号

    NAME VARCHA陆风X8(20)  
  — 部门名称

)

INSERT INTO dept

SELECT 0,0,’全部’ UNION ALL

SELECT 1,0,’财务部’ UNION ALL

SELECT 2,0,’行政部’ UNION ALL

SELECT 3,0,’业务部’ UNION ALL

SELECT 4,3,’销售部’ UNION ALL

SELECT 5,3,’销售部’ UNION ALL

SELECT 6,3,’销售部’ UNION ALL

SELECT 7,0,’技术部’ UNION ALL

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图