sql server中“全部除外”的替代项

fae0ux8s  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(518)

标准sql定义 EXCEPT ALL 操作如下(postgres fiddle)

  1. CREATE TABLE T1(X INT);
  2. CREATE TABLE T2(X INT);
  3. INSERT INTO T1 VALUES (1),(1),(2);
  4. INSERT INTO T2 VALUES (1),(2);
  5. SELECT X
  6. FROM T1
  7. EXCEPT ALL
  8. SELECT X
  9. FROM T2

这是回报

  1. +---+
  2. | X |
  3. +---+
  4. | 1 |
  5. +---+

因为有一个额外的 1 划入 T1T2 .
sql server只允许 EXCEPT 以及

  1. SELECT X
  2. FROM T1
  3. EXCEPT
  4. SELECT X
  5. FROM T2

返回空结果集。如何实施 EXCEPT ALL ?

j0pj023g

j0pj023g1#

EXCEPT ALL sql server不支持。和table在一起

  1. t1
  2. a | b
  3. --+--
  4. 1 | 1
  5. 1 | 1
  6. 1 | 1
  7. 1 | 2
  8. 1 | 2
  9. 1 | 3

以及

  1. t2
  2. a | b
  3. --+--
  4. 1 | 1
  5. 1 | 2
  6. 1 | 4

查询

  1. select a, b from t1
  2. except all
  3. select a, b from t2
  4. order by a, b;

会回来的

  1. a | b
  2. --+--
  3. 1 | 1
  4. 1 | 1
  5. 1 | 2
  6. 1 | 3

因为t1比t2多包含两(1 | 1)行、一(1 | 2)行和一(1 | 3)行。
要在sql server中实现同样的效果,请对行进行编号:

  1. select a, b from
  2. (
  3. select a, b, row_number() over (partition by a, b order by a) as rn from t1
  4. except
  5. select a, b, row_number() over (partition by a, b order by a) as rn from t2
  6. ) evaluated
  7. order by a, b;
展开查看全部
nfs0ujit

nfs0ujit2#

尝试where not exists子句,这将允许您不获取不同的列表。

  1. Use AdventureWorks2017;
  2. Go
  3. Create Table #A (a int, b varchar(1))
  4. Insert into #A (a, b)
  5. Select 1, 'A' UNION ALL
  6. Select 1, 'A' UNION ALL
  7. Select 1, 'A' UNION ALL
  8. Select 2, 'B'
  9. Create Table #B (a int, b varchar(1))
  10. Insert into #B (a, b)
  11. Select 2, 'B'
  12. Select a, b
  13. FROM #A
  14. EXCEPT
  15. Select a, b
  16. From #B
  17. Select a, b
  18. from #A as a where not exists (Select 1 from #B as b
  19. where a.a = b.a and a.b = b.b)

通过运行上述代码,可以看到where not exists子句和except之间的不同结果集。
希望这有帮助。

展开查看全部
bzzcjhmw

bzzcjhmw3#

根据定义, EXCEPT 从左输入查询返回右输入查询未输出的不同行。
sql小提琴
ms sql server 2017架构设置:

  1. CREATE TABLE MyTableA (ColA int, ColB int)
  2. CREATE TABLE MyTableB (ColA int, ColB int)
  3. INSERT INTO MyTableA (ColA, ColB) VALUES (15,1),(10,1),(2,1),(2,1),(16,1),(2,2),(3,3),(3,3)
  4. INSERT INTO MyTableB (ColA, ColB) VALUES (1,1),(1,1),(1,1),(2,2),(4,5),(1,1),(4,5)

查询1:

  1. SELECT * FROM MyTableA
  2. EXCEPT
  3. SELECT * FROM MyTableB

结果:

  1. | ColA | ColB |
  2. |------|------|
  3. | 2 | 1 |
  4. | 3 | 3 |
  5. | 10 | 1 |
  6. | 15 | 1 |
  7. | 16 | 1 |

问题2:

  1. Select *
  2. from MyTableA as a where not exists (Select 1 from MyTableB as b
  3. where a.ColA = b.ColA and a.ColB = b.ColB)

结果:

  1. | ColA | ColB |
  2. |------|------|
  3. | 15 | 1 |
  4. | 10 | 1 |
  5. | 2 | 1 |
  6. | 2 | 1 |
  7. | 16 | 1 |
  8. | 3 | 3 |
  9. | 3 | 3 |
展开查看全部

相关问题