2012-06-03 29 views
0

我从来没有试过这个,我不知道它是否是错误的。使用选择内部INSERT INTO表

INSERT INTO produits(produit_id, fournisseur_id, marque_id, categorie_id,produit_nom, 
        produit_prix, produit_description, quantite_stock, 
        date_production, date_expiration) 
    VALUES (seq_produits.nextval, 
      SELECT fournisseur_id FROM fournisseurs WHERE fournisseur_nom='LebanoCop', 
      SELECT marque_id FROM marques WHERE marque_nom='Hyper-Products', 
      SELECT categorie_id FROM categories WHERE categorie_nom='viandes', 
      'Mortadella', 2000, 'tres delicieuse', 100, '25-MAY-2012', '25-MAY-2013') 

可以工作吗?我收到错误,表示缺少表达。我正在使用Oracle。

+0

删除“VALUES”关键字:INSERT INTO produits(...)SELECT seq_produits.nextval,fournisseur_id,... FROM ..确保SELECT列表中的条目数与INSERT列表中的数量匹配。 – Glenn

+0

所有'SELECT'语句都保证最多返回一行吗? –

+0

将子查询放在括号内 - 也就是说,如果回答Martin Smiths的问题是肯定的,并且查询中使用的名称应该是。 –

回答

0

你似乎想要三个选定的值,它们将是来自三个子查询中的每一个的单例结果。我认为,应该工作的符号是:

INSERT INTO produits(produit_id, fournisseur_id, marque_id, categorie_id,produit_nom, 
        produit_prix, produit_description, quantite_stock, 
        date_production, date_expiration) 
    VALUES (seq_produits.nextval, 
      (SELECT fournisseur_id FROM fournisseurs WHERE fournisseur_nom='LebanoCop'), 
      (SELECT marque_id FROM marques WHERE marque_nom='Hyper-Products'), 
      (SELECT categorie_id FROM categories WHERE categorie_nom='viandes'), 
      'Mortadella', 2000, 'tres delicieuse', 100, '25-MAY-2012', '25-MAY-2013') 

有一组额外的比你原来的SQL各地各子查询所需的括号。这可以避免加入不可加入结果集时的任何问题。

在一般情况下,如果你想选择一个有可能大量的行插入,你就不会在所有使用VALUES子句,并会简单地列出INSERT列列表后的SELECT语句:

INSERT INTO produits(produit_id, ...) 
    SELECT ...