从同一个表的两个视图中选择 UNION

Yan*_*hon 3 postgresql postgresql-9.3

(抱歉标题含糊,如果有人想重新编辑,请做我的客人!)

我有工厂库存模块的这些表和视图:

+----------------------------+    +--------------------------+
| inv_items                  |    | inv_items_stock          |
+----------------------------+    +--------------------------+
| id bigserial (PK)          |    | item_id (FK) (inv_items) |
| name character varying(32) |    | qty integer              |
| is_group boolean           |    | ...                      |
| ...                        |    +--------------------------+
+----------------------------+ 

+---------------------------+     +---------------------------------+
| inv_items_group           |     | inv_items_production            |
+---------------------------+     +---------------------------------+
| group_id (FK) (inv_items) |     | item_id (FK) (inv_items)        |
| item_id (FK) (inv_items)  |     | unit_name character varying(16) |
+---------------------------+     | unit_qty number(12,4)           |
                                  +---------------------------------+

+----------------------------------+   +------------------------------+
| inv_items_vw                     |   | inv_items_groups_vw          |      
+----------------------------------+   +------------------------------+
| id (inv_items)                   |   | id (inv_items)               |
| name (inv_items)                 |   | name (inv_items)             |
| qty (inv_items_stock)            |   | ...                          |
| unit_name (inv_items_production) |   | items (json[]) (inv_item_vw) |
| unit_qty (inv_items_production)  |   +------------------------------+
| ...                              |
+----------------------------------+
Run Code Online (Sandbox Code Playgroud)

现在,对于另一种观点,我需要1从给定的行中获取行item_id并从inv_items_vw或返回inv_items_groups_vw,例如

SELECT * 
  FROM (SELECT id, name, qty, unit_name, unit_qty, ..., null
          FROM inv_items_vw
         UNION
        SELECT id, name, null, null, null, ..., items
          FROM inv_items_groups_vw) item
 WHERE item.id = @id
Run Code Online (Sandbox Code Playgroud)

但是最后一个查询返回ERROR: could not identify an equality operator for type json.

我理解错误,以及为什么我会得到这个,但是,我需要这个查询:)

如何解决此问题并从任一视图返回正确的行?

Dav*_*ett 7

UNION默认情况下,A将过滤掉重复的行(本质上是添加一个隐式的DISTINCT),这意味着比较行输出以过滤它们。

如果您有需要过滤掉的重复行,那么您可能需要将 JSON 类型转换为其他类型(您可以将其转换为字符串类型吗?-我不熟悉 postgres 和 JSON 支持)。

如果您没有要担心的重复行(或者您实际上想保留它们),则使用UNION ALL而不是普通行,UNION并且不需要进行比较。事实上,您可能会发现它UNION ALL更有效,最好一直使用UNION ALL,除非您明确需要删除重复行。


归档时间:

查看次数:

2968 次

最近记录:

11 年,10 月 前