SQL中EXCEPT函數在 Mysql 和 sqlServer 中的替代方法


 

示例摘自:極客代碼:http://wiki.jikexueyuan.com/project/sql/useful-functions/except-clause.html

EXCEPT 子句

EXCEPT 子句/運算符用於將兩個 SELECT 語句結合在一起,並返回第一個 SELECT 語句的結果中那些不存在於第二個 SELECT 語句結果的記錄。這就意味着,EXCEPT 僅返回那些不存在於第二個 SELECT 語句結果的記錄(差集)。

EXCEPT 運算符遵循同 UNION 運算符一樣的規則。MySQL 不支持 EXCEPT 運算符。

EXCEPT子句的基本語法如下所示:

SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]

EXCEPT

SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]

這里給定的條件可以是任何根據你自己的需要而得出的表達式。

示例:

考慮如下兩個表格,(a)CUSTOMERS 表:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

(b)ORDERS 表:

+-----+---------------------+-------------+--------+
| OID | DATE                |          ID | AMOUNT |
+-----+---------------------+-------------+--------+
| 102 | 2009-10-08 00:00:00 |           3 |   3000 |
| 100 | 2009-10-08 00:00:00 |           3 |   1500 |
| 101 | 2009-11-20 00:00:00 |           2 |   1560 |
| 103 | 2008-05-20 00:00:00 |           4 |   2060 |
+-----+---------------------+-------------+--------+

現在,讓我將這兩個表的 EXCEPT 查詢的結果結合在一起:

SQL> SELECT  ID, NAME, AMOUNT, DATE
     FROM CUSTOMERS
     LEFT JOIN ORDERS
     ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID
EXCEPT
     SELECT  ID, NAME, AMOUNT, DATE
     FROM CUSTOMERS
     RIGHT JOIN ORDERS
     ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

其結果如下所示:

+----+---------+--------+---------------------+
| ID | NAME    | AMOUNT | DATE                |
+----+---------+--------+---------------------+
|  1 | Ramesh  |   NULL | NULL                |
|  5 | Hardik  |   NULL | NULL                |
|  6 | Komal   |   NULL | NULL                |
|  7 | Muffy   |   NULL | NULL                |
+----+---------+--------+---------------------+

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++ 分割線 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- 測試表,與測試數據
CREATE TABLE union_tab_1 (
  id   INT,
  val  VARCHAR(10)
);
CREATE TABLE union_tab_2 (
  id   INT,
  val  VARCHAR(10)
);
INSERT INTO union_tab_1 VALUES(1, 'A');
INSERT INTO union_tab_1 VALUES(2, 'B');
INSERT INTO union_tab_1 VALUES(3, 'C');
INSERT INTO union_tab_2 VALUES(1, 'A');
INSERT INTO union_tab_2 VALUES(1, 'A');
INSERT INTO union_tab_2 VALUES(2, 'B');
INSERT INTO union_tab_2 VALUES(4, 'D');

 

 

EXCEPT– 返回第一個表中有、第二個表中沒有的數據 

 

SQL  Server   支持

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1>  SELECT  FROM  union_tab_1
2>  EXCEPT
3>  SELECT  FROM  union_tab_2;
4> go
id          val
----------- ----------
           3 C
(1 行受影響)
1>  SELECT  FROM  union_tab_2
2>  EXCEPT
3>  SELECT  FROM  union_tab_1;
4> go
id          val
----------- ----------
           4 D
(1 行受影響)

 

 

MySQL  不支持

實現相同功能的 SQL 如下:

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT
   DISTINCT  union_tab_1.*
FROM
   union_tab_1  LEFT  JOIN  union_tab_2
     ON  (union_tab_1.id = union_tab_2.id
         AND  union_tab_1.val = union_tab_2.val)
   union_tab_2.id   IS   NULL ;
+ ------+------+
| id   | val  |
+ ------+------+
|    3 | C    |
+ ------+------+
1 row  in  set  (0.00 sec)
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM