【问题标题】:Insert 1 statement based on 3 select statements根据 3 个 select 语句插入 1 个语句
【发布时间】:2015-09-16 14:24:10
【问题描述】:

我有一张这样的桌子:

| Name | Parent Id | Pricing Id | Paper Id |
|------------------------------------------|
|      |           |            |          |

我想插入的。问题是,客户不知道 ID,只知道 Parent/Pricing/Paper 表中名称字段的值:

| Name | Parent Id | Pricing Id | Paper Id |
|------------------------------------------|
|Narnia| Movies    | MidTier    | Film     |
|Transf| Movies    | HighTier   | Comic    |

MoviesMidTier/HighTierFilm/Comic 需要转换为整数...这是伪查询:

INSERT INTO products (Name, ParentId, PricingId, PaperId)
    VALUES (
        "Narnia",
        SELECT id FROM categories WHERE Name="Movies",
        SELECT id FROM pricing WHERE Name="MidTier",
        SELECT id FROM papers WHERE Name="Film"
    )

显然这行不通,但正确的做法是什么?

编辑:请注意,效率并不是一个超级优先事项,因为这将是一次性导入(数十万种产品)。

【问题讨论】:

  • 你的问题到底是什么?
  • @cybork 编辑前的最后一句话。

标签: sql select sql-insert


【解决方案1】:

假设这3个表不能连接在一起,你可以为不同的id定义变量

DECLARE @categoryId INT,
       @pricingId INT,
       @papersId INT

SELECT @categoryId = id FROM categories WHERE Name="Movies",
SELECT @pricingId = id FROM pricing WHERE Name="MidTier",
SELECT @papersId = id FROM papers WHERE Name="Film"

INSERT INTO products (Name, ParentId, PricingId, PaperId)
VALUES ('Narnia', @categoryId, @pricingId, @paperId) 

但如果您可以加入这些表并插入如下通用语句的值:

INSERT INTO tbl (...)
SELECT t2.id, t3.id
FROM tbl2 as t2
INNER JOIN tbl3 as t3 on t3.id = t2.t3_id

【讨论】:

    【解决方案2】:

    就个人而言,我更喜欢这些,因为您可以看到将插入的确切内容。要么应该工作。如果性能是一个问题,您应该检查它们,但我更喜欢交叉连接,因为我可以在一个位置看到所有值。我正在为纳尼亚使用一个子选择,所以如果我们想插入 20 个产品,我们可以简单地在子选择中添加一个联合。

    INSERT INTO products (Name, ParentId, PricingId, PaperId)
        SELECT
            Name.Name,c.ID,prc.ID,ppr.ID
        FROM (
            SELECT 'Narnia' [Name]
        ) [Name]
        CROSS JOIN categories c
        CROSS JOIN pricing prc
        CROSS JOIN papers ppr
        WHERE 
            c.Name='Movies'
        AND prc.Name='MidTier'
        AND ppr.Name='Film'
    
    INSERT INTO products (Name, ParentId, PricingId, PaperId)
        SELECT
            Name.Name,c.ID,prc.ID,ppr.ID
        FROM (
            SELECT 'Narnia' [Name]
        ) [Name]
        LEFT JOIN categories c ON c.Name='Movies'
        LEFT JOIN pricing prc ON prc.Name='MidTier'
        LEFT JOIN papers ppr ON ppr.Name='Film'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-08
      • 2016-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多