标签: union

为什么 SQL Server 不优化 UNION?

考虑这些查询(SQL Fiddle):

查询 1:

SELECT * INTO #TMP1 FROM Foo
UNION
SELECT * FROM Boo
UNION
SELECT * FROM Koo;
Run Code Online (Sandbox Code Playgroud)

查询 2:

SELECT * INTO #TMP2 FROM Foo
UNION
SELECT * FROM Boo
UNION ALL
SELECT * FROM Koo;
Run Code Online (Sandbox Code Playgroud)

请注意,Koo 与 Boo/Foo 不重叠,因此最终结果是相同的。问题是为什么第一个UNION / UNION组合没有合并成单个 SORT 操作?

performance sql-server optimization union query-performance

7
推荐指数
1
解决办法
2万
查看次数

将 COLLATE 与 UNION 结合使用

怎么COLLATEUNION?我想合并 2 个表(都具有相同的列和相同的类型:)varchar,int, int, decimal

我收到以下错误:

sg 468, Level 16, State 9, Line 1 无法解决 UNION 操作中“Serbian_Latin_100_CI_AS”和“Croatian_CI_AS”之间的排序冲突。

我的 SQL 语句:

select * from #IA_BIH
union 
select * from #IA_MNE  
Run Code Online (Sandbox Code Playgroud)

我应该在哪里插入collate database_default?我尝试了不同的组合,但没有奏效。

sql-server collation t-sql union

7
推荐指数
1
解决办法
4万
查看次数

过滤 UNION ALL 结果比过滤每个子查询慢得多

编辑:请参阅结尾以获得更简单的示例)

我在一个名为“cases”(135k 行,29 列)的表中搜索。此表中的某些行具有父子关系类型(不同类型),这意味着对于这些记录,必须混合使用父/子字段来过滤和显示。

我已经确定了四种不同的父子关系并为它们创建了视图:

  • caselist_no_specials:不是子记录,按原样使用记录数据;总共 116106 行。
  • caselist_disputes_with_ipr:子记录;共 138 行。
  • caselist_mark_children:子记录;总共 18132 行。
  • caselist_design_children:子记录;共 671 行。

这些视图的结果不重叠,共同覆盖了表格的 100%。

当我选择所有这些的联合并分别过滤每个视图时,查询需要大约 9 毫秒。选择所有视图的联合并过滤其结果大约需要 500 毫秒。

我还在没有视图的情况下对此进行了测试,内联了它们包含的查询,但没有产生可衡量的改进。

这是快速查询(解释):

  SELECT  c.*
    FROM  caselist_no_specials c
    JOIN  case_clients cacl ON cacl.case_id = c.main_id
   WHERE  cacl.client_id = 12046

   UNION ALL

  SELECT  c.*
    FROM  caselist_disputes_with_ipr c
    JOIN  case_clients cacl ON cacl.case_id = c.main_id
   WHERE  cacl.client_id = 12046

   UNION ALL

  SELECT  c.*
    FROM  caselist_mark_children c
    JOIN  case_clients cacl ON cacl.case_id = c.main_id
   WHERE  cacl.client_id …
Run Code Online (Sandbox Code Playgroud)

postgresql performance view union postgresql-performance

7
推荐指数
1
解决办法
3712
查看次数

无论两个连接表中的列顺序如何,都执行 UNION ALL

SELECT * INTO TABLE1 
FROM Table2
UNION ALL 
SELECT * FROM Table3;
GO
Run Code Online (Sandbox Code Playgroud)

我正在使用此查询将两个表堆叠到一个表中。这些表的列顺序应该完全相同,这样查询才能成功执行。

我想知道是否有一个技巧我们可以做到,无论列顺序如何,它都可以工作。有没有办法指示 SQL Server 按名称自动排列两个表中的列并执行UNION

例如,在 SAS 中,诀窍是编写一个OUTER UNION CORR查询。

sql-server union

6
推荐指数
1
解决办法
9055
查看次数

优化 MySQL 中的 UNION 查询

我在 MySQL 中的 UNION 查询有问题。我们的网站上有 1000 万玩家,我们希望选择具有多标准系统的玩家。例如,选择美国人,男性,年龄超过 35 岁。

我们正在使用“垂直分区”:每个标准 1 个表。例如:

* user_country
- id_user
- id_country
Run Code Online (Sandbox Code Playgroud)

我们想做这样的查询:

SELECT id_inscri FROM userdata_langue
WHERE id_langue='43'
  UNION
SELECT id_inscri FROM userdata_sexe
WHERE sexe='2'
  UNION
SELECT id_inscri FROM userdata_nb_jour
WHERE nb_jour>='31'
  UNION
SELECT id_inscri FROM userdata_last
WHERE last<='2013-04-07'
  AND last>='2013-04-03' ;
Run Code Online (Sandbox Code Playgroud)

我该如何优化?

- - - 更多细节

解释查询的输出:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   PRIMARY userdata_langue ref id_langue   id_langue   1   const       398846  Using index
2   UNION   userdata_sexe   ref …
Run Code Online (Sandbox Code Playgroud)

mysql optimization union

6
推荐指数
1
解决办法
6667
查看次数

如何通过许多重复的 UNION 子查询来减少查询大小?

我使用 Postgres 13 并使用以下 DDL 定义了一个表:

CREATE TABLE item_codes (
    code    bytea                    NOT NULL,
    item_id bytea                    NOT NULL,
    time    TIMESTAMP WITH TIME ZONE NOT NULL,
    PRIMARY KEY (item_id, code)
);

CREATE INDEX ON item_codes (code, time, item_id);
Run Code Online (Sandbox Code Playgroud)

我使用以下查询:

SELECT DISTINCT time, item_id
FROM (
      (SELECT time, item_id
       FROM item_codes
       WHERE code = '\x3965623166306238383033393437613338373162313934383034366139653239'
       ORDER BY time, item_id
       LIMIT 100)
       UNION ALL
      (SELECT time, item_id
       FROM item_codes
       WHERE code = '\x3836653432356638366638636338393364373935343938303233343363373561'
       ORDER BY time, item_id
       LIMIT 100)
     ) AS items
ORDER …
Run Code Online (Sandbox Code Playgroud)

postgresql execution-plan union query-performance postgresql-performance

6
推荐指数
1
解决办法
608
查看次数

如何结合 UNION 和 INNER JOIN?

我正在获取树中所有节点的祖父母,如下所示:

SELECT P.id, P.parent, GP.parent gp_id FROM product_groups P             
INNER JOIN product_groups GP ON P.parent = GP.id
Run Code Online (Sandbox Code Playgroud)

id=0表中没有条目 with ,但有一些 where parent=0,表示树的根。此查询不会获取这些行,因为没有祖父母可以加入它们。我希望返回这些行,同时使用0(or NULL)parentgp_id

我打算用 到UNION第二个表(0,0),但无法弄清楚语法。这该怎么做?

mysql join union

5
推荐指数
1
解决办法
7万
查看次数

关系代数中并集运算产生的关系中的主键

我对关系代数中联合运算的结果表/关系有疑问。结果关系没有主键吗?或者它返回一个带有隐藏主键的表?

示例:假设我们取以下两个表的并集:

R1:
id | name
----------
1    a
2    b
3    c

R2:
id | name
----------
1    b
2    c
3    d
Run Code Online (Sandbox Code Playgroud)

其中属性“id”是关系 R1 和 R2 中的主键,现在这两者的并集将是:

id | name
------------
1     a
1     b
2     b
2     c
3     c
3     d
Run Code Online (Sandbox Code Playgroud)

现在,结果关系中的任何属性都不能成为主键,因为 id 和 name 都包含重复项。DBMS 如何解决这个问题?

union relational-theory

5
推荐指数
1
解决办法
4830
查看次数

如何将 UNION 与 EXISTS 结合起来?

我有一个如下所示的查询:

SELECT PubKey, Title FROM Publication
UNION
SELECT NoteKey, Title, FROM Note
Run Code Online (Sandbox Code Playgroud)

效果很好。当我尝试向其中添加 EXIST 时,我的麻烦就开始了:

SELECT PubKey, Title FROM Publication
UNION
SELECT NoteKey, Title, FROM Note
WHERE EXISTS (SELECT * FROM UserPublication WHERE UserPublication.PubKey = Publication.PubKey)
Run Code Online (Sandbox Code Playgroud)

这会引发此错误:无法绑定多部分标识符“PubKey”。

可以用另一种方式写吗?

union exists

5
推荐指数
1
解决办法
2万
查看次数

使用哈希匹配运算符实现的联合

我正在查看 TechNet 上列出的 SQL Server 物理运算符(不要判断,你知道你已经完成了)并读到哈希匹配物理运算符有时用于实现UNION逻辑运算符

我从未见过这样做过,并想了解更多。一个示例查询会很棒。什么时候使用它,什么时候它比替代品更好?(这些通常是相同的,但并非总是如此。)

sql-server optimization execution-plan database-internals union

5
推荐指数
3
解决办法
1532
查看次数