2016-01-28 40 views
2

我可以在postgres 9.4中写这样的东西吗?'UNION ALL'可以和postgres中的'INSERT INTO'一起使用吗?

SELECT id FROM image_instance WHERE name = 'bioboxes/velvet-then-quast' 

UNION ALL 

INSERT INTO image_instance (name, sha256, image_type_id) 
SELECT 
    'bioboxes/velvet-then-quast', 
    'digest_4', 
    (SELECT id FROM image_type WHERE name = 'short_read_preprocessing_reference_evaluation') 
WHERE NOT EXISTS (SELECT id FROM image_instance WHERE name = 'bioboxes/velvet-then-quast') 
RETURNING id 

我得到INSERT的语法错误,所以我认为这是不可能的?我认为值得一问,以防我写错了。

我知道这不是线程安全的,但是这是针对单线程应用程序的。

+0

你你试过它的格式INSERT INTO ... SELECT .... UNION ALL SELECT ...?此外,您选择的字段数量必须等于您要插入的字段数量。 – Dijkgraaf

+0

@Dijkgraaf感谢您的建议。我尝试交换顶部和底部的子句,但后来我在UNION –

+0

上得到语法错误这可能是由于您的第一次选择只有一个字段和第二个三个字段。他们都必须有与插入相同的数字(三)。试着让你的SELECT UNION ALL SELECT首先进行,然后当这是好的时候,然后将你的INSERT添加到顶部 – Dijkgraaf

回答

1

看来你是在这之后。只是包装你的INSERT成CTE(使用):

WITH 
CTE 
AS 
(
    INSERT INTO image_instance (name, sha256, image_type_id) 
    SELECT 
     'bioboxes/velvet-then-quast', 
     'digest_4', 
     (SELECT id FROM image_type WHERE name = 'short_read_preprocessing_reference_evaluation') 
    WHERE NOT EXISTS (SELECT id FROM image_instance WHERE name = 'bioboxes/velvet-then-quast') 
    RETURNING id 
) 
SELECT id FROM image_instance WHERE name = 'bioboxes/velvet-then-quast' 
UNION ALL 
SELECT id FROM CTE 
; 

该查询会插入一些行到image_instance;生成的id列的值将由RETURNING子句返回;它们将是UNIONed ALL,其中id的值(前面的?)从image_instance

我不确定结果是什么,你应该检查,但语法应该是正确的。

+0

感谢这个弗拉基米尔。我正在使用CTE,但我想知道是否有办法使用UNION ALL进一步简化它,但它似乎不可行。 –

+1

你最好解释你想达到的目标,你最终的目标是什么,而不是关注语法。答案中的查询可能有正确的语法,但对我来说没有多大意义。 –