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.
我理解错误,以及为什么我会得到这个,但是,我需要这个查询:)
如何解决此问题并从任一视图返回正确的行?
UNION默认情况下,A将过滤掉重复的行(本质上是添加一个隐式的DISTINCT),这意味着比较行输出以过滤它们。
如果您有需要过滤掉的重复行,那么您可能需要将 JSON 类型转换为其他类型(您可以将其转换为字符串类型吗?-我不熟悉 postgres 和 JSON 支持)。
如果您没有要担心的重复行(或者您实际上想保留它们),则使用UNION ALL而不是普通行,UNION并且不需要进行比较。事实上,您可能会发现它UNION ALL更有效,最好一直使用UNION ALL,除非您明确需要删除重复行。