【问题标题】:UNION SELECT not displaying all columnsUNION SELECT 不显示所有列
【发布时间】:2014-08-24 23:26:55
【问题描述】:

我有几个VIEWs,它们嵌套在一个更大的VIEW 中用作报告。

CREATE VIEW view1 AS
    SELECT table1.col1 AS t1c1, table1.col2 AS t1c2
    FROM table1
    WHERE table1.col1 = 0
;

SAMPLE OUTPUT:

SELECT * FROM view1;
+-------------------+
|  t1c1  |   t1c2   |
+--------+----------+
|    0   |  t1stuff |
+--------+----------+
|    0   | t1stuff2 |
+--------+----------+

.

CREATE VIEW view2 AS
    SELECT table2.col1 AS t2c1, table2.col2 AS t2c2
    FROM table2
    WHERE table2.col1 = 5
;

SAMPLE OUTPUT:

SELECT * FROM view2;
+-------------------+
|  t2c1  |   t2c2   |
+--------+----------+
|    5   |  t2stuff |
+--------+----------+
|    5   | t2stuff2 |
+--------+----------+

.

然后我将它们组合成一个“报告”视图,如下所示:

CREATE VIEW view3 AS
    SELECT * FROM view1
    UNION
    SELECT * FROM view2
;

SAMPLE OUTPUT:
SELECT * FROM view3;
+-------------------+
|  t1c1  |   t1c2   |
+--------+----------+
|    0   |  t1stuff |
+--------+----------+
|    0   | t1stuff2 |
+--------+----------+
|    5   |  t2stuff |
+--------+----------+
|    5   | t2stuff2 |
+--------+----------+

代替预期:

+-------------------+--------+----------+
|  t1c1  |   t1c2   |  t2c1  |   t2c2   |
+--------+----------+--------+----------+
|    0   |  t1stuff |        |          |
+--------+----------+--------+----------+
|    0   | t1stuff2 |        |          |
+--------+----------+--------+----------+
|        |          |   5    | t2stuff  |
+--------+----------+--------+----------+
|        |          |   5    | t2stuff2 |
+--------+----------+--------+----------+

我怎样才能达到预期的效果?

【问题讨论】:

  • UNIONUNION ALL 集合运算符根据每个集合中的列位置组合集合。就集合中的列数和每列的数据类型而言,组合的每个集合都必须“匹配”。 (列的名称并不重要;生成的组合集中的列的名称是从第一个集合派生的。)在您的示例中,UNION 运算符正在按照规范执行请求的操作。跨度>

标签: mysql sql join view union


【解决方案1】:

如果没有任何数据相关并且甚至不共享列,那么人们会质疑为什么要在单个查询中开始执行此操作。但无论如何,您都必须指定所有列:

select col1 as t1c1, col2 as t1c2, null as t2c1, null as t2c2
from view1
union all
select null as t1c1, null as t1c2, col1 as t2c1, col2 as t2c2
from view2

【讨论】:

  • 在单个查询中执行此操作,以便我的会计人员可以在同一个电子表格上查看我们各种销售渠道上发生的事情的快照(它们是相关的,而不是所提供的数据)。我现在就试试你的建议。
  • +1。使用 UNION ALL 集合运算符可避免在使用 UNION 运算符时识别和删除重复行的额外开销。
【解决方案2】:
SELECT * FROM view1
FULL OUTER JOIN view2
  on 1=0

联合用于连接类似的数据,在这种情况下,您不希望同一列中的数据 在这里加入似乎更合适...

完整的外部返回每个集合中的所有记录,因为我们不希望任何匹配我们可以使用 1=0 以便它们不相关,但您会得到预期的结果。

bah...mySQL 不支持完全外连接...所以需要一个联合。又被非旧标准引擎烧毁了。

【讨论】:

  • hmm.. 这似乎在抱怨:near 'OUTER JOIN view2 ON 1=0' -- 整个查询行:CREATE VIEW view3 AS SELECT * FROM view1 FULL OUTER JOIN view2 ON 1=0;
  • mySQL 对完全外连接的支持不存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-12
相关资源
最近更新 更多