插入联合all,子查询

时间:2016-04-21 18:20:19

标签: mysql sql

我想在datashop中插入所有数据,其中shopdata与shopid的单个dataid, 我有两张桌子

第一个数据,

 id 
 1
 2
 3
 4
 5

2nd datashop

 dataid   | shopid
 -----------------
    1     |    1 
    2     |    1 
    3     |    1 
    4     |    1 
    5     |    1 
    1     |    2 
    2     |    2 
    3     |    2

现在我希望在shopat

的datashop中插入所有数据

我尝试使用查询但不起作用......

 INSERT INTO datashop( dataid , shopid ) 
 (Select id
 from (Select id from data
 Union all
 Select dataid from datashop )Z
 group by id as dataid , 3 as shopid) 

此查询未运行显示多个错误

  

分析过程中发现了5个错误。

     

意外的令牌。 (靠近“(”第49位)

     

预计会有表达。 (靠近“(”在第71位)

     

意外的令牌。 (靠近“(”在第71位)

     

此类型的子句先前已被解析。 (在第72位“选择”附近)

     

无法识别的声明类型。 (位置111的“全部”附近)

3 个答案:

答案 0 :(得分:3)

这是您想要的语法:

insert into datashop(dataid, shopid) 
    Select id, 3 as shopid
    from (Select id from data
          Union all
          Select dataid from datashop
         ) Z
    group by id;

你有几个小问题:

  • 您在查询后列出了列。这可能是语法问题的原因。
  • 您在group by子句中有别名(与上一点相关)。
  • 您的select没有适当数量的列。
  • select周围的括号是不必要的。

另请注意:查询可以简化为:

insert into datashop(dataid, shopid) 
    Select id, 3
    from data
    Union
    Select dataid, 3
    from datashop;

union删除重复项。

答案 1 :(得分:0)

insert into datashop(dataid, shopid)  
Select id as dataid, 3 as shopid
  from from data
Union 
Select id as dataid, 4 as shopid
  from from data
Union 
Select id as dataid, 5 as shopid
  from from data

答案 2 :(得分:0)

规范不是很清楚。

看起来你有一张桌子,让我们称之为(为了举例)“shop”并且该表包含一个列“id”(整数类型?)并且表中有五行,值为1看起来“id”列可能是表的主键,或者至少保证是唯一且非空。

然后看起来你有第二个表,你想要填充一些行。该表包含两列,一列名为id,另一列名为shopid。

我们不知道这个表在模型中代表什么,所以我们真的只是在猜测。在我看来,你可能正在寻找笛卡尔积,每个shop.id与其他shop.id相匹配,包括两列相等的行。

由于缺少其他名称,我们将第二个表称为“shop_to_shop”。

同样,这只是一个猜测...但也许您正在寻找使用以下查询的结果填充shop_to_shop表:

  SELECT r.id   AS id
       , s.id   AS shopid
    FROM shop r
   CROSS
    JOIN shot s
   ORDER
      BY r.id
       , s.id

如果“shop”在“shop”中是唯一的(再次,只是一个猜测),结果中不会有任何重复的元组。如果“shop_to_shop”表中已有一些行,并且我们不想创建表中已有的任何重复行,我们可以使用反连接

  SELECT r.id   AS id
       , s.id   AS shopid
    FROM shop r
   CROSS
    JOIN shot s
    LEFT
    JOIN shop_to_shop t
      ON t.id     = r.id
     AND t.shopid = s.id
   WHERE t.id IS NULL
   ORDER
      BY r.id
       , s.id

一旦我们得到一个返回我们想要插入的行的SELECT语句,无论是什么,将它转换为INSERT语句,前面加上“insert tablename(colname,colname)”

  INSERT INTO shop_to_shop (id, shopid)
  SELECT ...