Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql “有什么用?”;联合所有人;?_Sql - Fatal编程技术网

Sql “有什么用?”;联合所有人;?

Sql “有什么用?”;联合所有人;?,sql,Sql,我不是在问它们之间的区别,我的问题是什么时候我们需要使用“Union All”?当您确实需要多个行的“副本”时,您会使用Union All,否则在使用Union时这些行将被删除。它在查询端也可以更快,因为DB引擎不需要确定结果集之间的重复项。当我们不需要从记录集中排除重复的行时 联合将删除重复项 UNION ALL不删除重复项 范例 SELECT 1 AS foo UNION SELECT 1 AS foo = one row SELECT 1 AS foo UNION ALL SELEC

我不是在问它们之间的区别,我的问题是什么时候我们需要使用“Union All”?

当您确实需要多个行的“副本”时,您会使用Union All,否则在使用Union时这些行将被删除。它在查询端也可以更快,因为DB引擎不需要确定结果集之间的重复项。

当我们不需要从记录集中排除重复的行时

  • 联合将删除重复项
  • UNION ALL不删除重复项
范例

SELECT 1 AS foo
UNION
SELECT 1 AS foo

= one row

SELECT 1 AS foo
UNION ALL
SELECT 1 AS foo

= two rows

何时需要使用它们取决于您的需求。UNION和UNION ALL之间的区别在于UNION ALL不会删除重复的行。

UNION ALL用于将多个数据集合并到一个数据集中,但不会删除重复的行。

如果两个结果集具有相同的列(编号和类型),则使用UNION ALL将两个结果集合并(附加)到一个结果集中.

举例说明:

mysql> select * from tmp1;
+------+
| a    |
+------+
| foo1 |
| foo2 |
+------+
2 rows in set (0.00 sec)

mysql> select * from tmp2;
+------+
| a    |
+------+
| foo2 |
| foo3 |
| foo4 |
+------+
3 rows in set (0.00 sec)

mysql> select * from tmp1 union select * from tmp2;
+------+
| a    |
+------+
| foo1 |
| foo2 |   # DUPLICATES REMOVED.
| foo3 |
| foo4 |
+------+
4 rows in set (0.00 sec)

mysql> select * from tmp1 union all select * from tmp2;
+------+
| a    |
+------+
| foo1 |
| foo2 |
| foo2 |    # DUPLICATES NOT REMOVED.
| foo3 |
| foo4 |
+------+
5 rows in set (0.00 sec)
关于何时使用UNION ALL的问题?


如果您不关心结果集是否有重复行,或者如果您知道不会有任何重复行,则使用
UNION ALL
而不是
UNION

为什么
UNION
UNION ALL

答复:
如果您正在从两个或多个不同的表(我的意思是,通过关系)中查找一些数据,那么您可以使用它。

因为结果将是一个表,并且每个表都应该有一个键,
UNION
确保行的唯一性,所以理论上您应该始终使用
UNION
。但是,由于
UNION ALL
不能确保行的唯一性,因此
UNION ALL
可以执行得更好,因此,如果可以确保两个表都已包含唯一的行,则在实践中可能是首选


同样的逻辑也适用于
选择不同的
选择全部
,顺便说一句。

默认情况下,UNION将消除重复值。如果将UNION替换为UNIONALL,则不会再消除重复值。:)

想象一下,你正在分析美国在奥运会上的表现。您希望在多个表格中,跨多个日期/年份堆叠(联盟)田径项目的奖牌(银、金)。您不希望在“国家代码”列中使用UNION,因为它会忽略有价值的信息。将有许多观察结果包含USA和“Gold”,但每一个都是自己的观察结果。

除了重复性差异和性能之外,应该考虑的情况是,当您期望结果结合在一起时,本质上完全不同,但可以在操作上给出共同的结果乙二醇

    Select name from table
     Union all
    Select max(name) from table

      Vs

     Select name from table
     Union 
    Select max(name) from table

如果max(name)与name相同,那么union将给出一条记录,union all将给出两条记录。但如果我知道max of name和列表中某个特定名字的max是一样的话,那么就选择union all。我的意思是这是一个非常基本的场景。Union all在join语句的情况下可能会产生很大的差异,这些语句通常可能会被设置为不同的语句,但可能会在操作上产生共同的结果

如果您进行了大量的联接并且有多余的行,您会使用GROUP BY而不是Union吗?UNION和DISTINCT之间有什么区别?@meder:GROUP BY删除重复项是滥用:它用于聚合。每选择一个都是不同的。也就是说,我可以选择不同的。。联合所有选择。。。如果需要的话。这意味着删除重复的第1条,但保留UNION上的所有行。投票被否决,因为OP说“我不要求它们之间的差异”+1提及性能-这几乎是至关重要的,需要了解UNION vs UNION all对更大表的影响,对于大型结果集,UNION的执行速度比UNION ALL慢几个数量级(因为在大多数情况下,删除重复项意味着构建临时索引;对于较小的结果集,这不会太昂贵,结果集的大小是返回的行数),我会说“可以容忍”多个副本,而不是“需要”。例如,当您说
WHERE ForeignKey IN(从视图1中选择Id)时,UNION ALL从视图2中选择Id)
。您不需要两者都需要,但您可以容忍两者“当您确实需要行的多个“副本”[…]”:在什么情况下会这样?你能举个例子吗?谢谢,你所有的答案都说只有两个要点:1)重复行和2)。演出这意味着我们可以使用其中任何一个,所以我不明白为什么我们不能在这个查询中使用union。使用tempData as(选择32作为col1,char(32)作为col2 union all选择col1+1,char(col1+1)from tempData,其中col1<127)选择*fromtempData@JeevanBhatt-在查询中使用“UNION”而不是“UNIONALL”时会发生什么?您使用的是什么数据库?@jeevanbhatt-查看了一下您的查询后,我相信有一些语法错误阻止了它的执行。CTE中的第一个子查询缺少FROM子句,第二个子查询引用CTE中的CTE,这是不允许的。您的查询试图完成什么?@Bob-我使用的是SQL Server 2008,如果我使用“union”而不是“union all”,则会出现错误:递归公共表表达式“tempData”不包含顶级union all运算符。@Jeevan Bhatt-显然SQL Server 2008允许递归CTE,但我只有Oracle可供测试,而且Oracle似乎不允许递归CTE。因此,我在这里帮不了什么忙。但是,错误消息似乎表明,在SQLServer2008中,递归CTE中的第一个UNION运算符必须是UNIONALL。祝你好运。我不是在问他们之间的区别。我没想到在近10年后会得到评论:)。你和工会还有问题,我可以帮你吗?