繁体   English   中英

全部插入子查询

[英]Insert into union all ,subquery

我想将所有数据插入到具有shopid的单个dataid的shopdata的datashop中,我有两个表

第一数据

 id 
 1
 2
 3
 4
 5

第二个数据商店

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

现在我想用shopid将所有数据插入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附近)

这是您想要的语法:

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删除重复项。

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

规格不是很清楚。

看起来您有一个表,我们称它为“商店”(例如),该表包含单个列“ id”(整数类型?),并且该表中有5行,其值是1到5。看起来“ id”列可能是表的主键,或者至少保证是唯一且非null。

然后,看起来您有第二个表,要在其中填充一些行。 该表包含两列,一列名为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

如果“ id”在“商店”中是唯一的(同样,只是一个猜测),结果中将不会有任何重复的元组。 如果“ 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语句,无论是什么,都可以在其前面加上“插入表名(colname,colname)”,将其转换为INSERT语句。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM