当前位置: 首页 > 知识库问答 >
问题:

使用返回的id在1个查询中跨3个表插入多行

秦安宁
2023-03-14

我正在以3个表格的形式记录体育比赛数据:

  • 匹配项(id、开始时间)
  • 比赛团队(id、比赛id、团队id、分数)
  • 比赛球员(id、比赛id、球队id、球员id)

每场比赛由几个队组成,每个队由几个球员组成(实际上是一个名单)。team_id和player_id分别作为球队和球员桌上的外键。

使用上述结构,我需要首先插入matches表,并使用返回的id传递给match_团队和match_玩家。

根据此问题,我使用以下CTE来完成此操作,插入一个匹配项:

WITH a AS (INSERT INTO matches (start_time) 
VALUES ('"0001-01-01T00:00:00+00:00"') 
RETURNING id), 
b AS (INSERT INTO match_teams (match_id, team_id, score) 
VALUES 
((SELECT id FROM a), 5, 1), 
((SELECT id FROM a), 6, 2)) 
INSERT INTO match_players (match_id, team_id, player_id) 
VALUES 
((SELECT id FROM a), 5, 3), 
((SELECT id FROM a), 5, 4),
((SELECT id FROM a), 6, 5)
((SELECT id FROM a), 6, 6); 

我想在一个查询中同时插入多个匹配项。我使用偏移和限制为球员/球队选择正确的比赛id。

WITH a AS (INSERT INTO matches (start_time) 
VALUES 
('"0001-01-01T00:00:00+00:00"'),     -- 1st match
('"0001-01-01T00:00:00+00:00"')      -- 2nd match
RETURNING id), 
b AS (INSERT INTO match_teams (match_id, team_id, score) 
VALUES 
((SELECT id FROM a OFFSET 0 LIMIT 1), 5, 1),     -- 1st match
((SELECT id FROM a OFFSET 0 LIMIT 1), 6, 2),     -- 1st match
((SELECT id FROM a OFFSET 1 LIMIT 1), 5, 2),     -- 2nd match
((SELECT id FROM a OFFSET 1 LIMIT 1), 6, 1))     -- 2nd match
INSERT INTO match_players (match_id, team_id, player_id) 
VALUES 
((SELECT id FROM a OFFSET 0 LIMIT 1), 5, 3),     -- 1st match
((SELECT id FROM a OFFSET 0 LIMIT 1), 6, 4),     -- 1st match
((SELECT id FROM a OFFSET 1 LIMIT 1), 5, 5),     -- 2nd match
((SELECT id FROM a OFFSET 1 LIMIT 1), 6, 6);     -- 2nd match

这是可行的,但这似乎是一个有点老套的html" target="_blank">解决方案。有没有一种最佳实践方法可以做到这一点?

更新我意识到我有一些多余的列。我已经解决了这个问题,但我不认为它会显著改变这个问题。我的问题更像是“使用偏移和限制是否像这样的最佳实践?”

共有2个答案

万高洁
2023-03-14

就我而言,我有route\u来源routes

  • route_sources有route_source_id为PK
  • 路由有route_source_id为FK

.

-- GOT ID TO ROUTE_SOURCES FROM SEQUENCE
int_route_source_id = nextval('traffic.route_sources_route_source_id_seq'::regclass);

-- CREATE NEW RECORD FOR ROUTE_SOURCES
INSERT INTO traffic.Route_Sources 
    (route_source_id, sql, ini_avl_id, ini_link_id)
VALUES
    (int_route_source_id, strSQL, A.avl_id, A.link_id, ini_offset); 

-- CREATE THE ROUTE
INSERT INTO traffic.Routes 
    (route_source_id, seq_id, node_id, link_id, cost)               
SELECT int_route_source_id, seq, id1 AS node, id2 AS edge, cost::numeric(11,4)
    FROM pgr_trsp; 

王成化
2023-03-14

使用偏移和限制是否是最佳做法?

当然不是。这是非常低效和非常不方便的使用,尤其是对于大量的匹配。

您可以使用row\u number()选择合适的id加入团队玩家加入团队

with teams (rn, team_ids, scores) as (
    values 
        (1, array[5, 6], array[1, 2]),  -- match #1 in this query
        (2, array[5, 6], array[2, 1])   -- match #2 in this query
    ),
players (rn, team_ids, player_ids) as (
    values 
        (1, array[5, 5, 6, 6], array[3, 4, 5, 6]),
        (2, array[5, 5, 6, 6], array[3, 4, 5, 6])
    ),
ins_matches as (
    insert into matches (start_time) 
    values 
        ('"0001-01-01t00:00:00+00:00"'),
        ('"0001-01-01t00:00:00+00:00"')
    returning id
    ),
matches as (
    select id, row_number() over (order by id) rn
    from ins_matches        -- rn - number of match in this query
    ),
ins_teams as (
    insert into match_teams (match_id, team_id, score) 
    select id, unnest(team_ids), unnest(scores)
    from matches
    join teams using(rn)
    ) 
insert into match_players (match_id, team_id, player_id) 
select id, unnest(team_ids), unnest(player_ids)
from matches
join players using(rn);
 类似资料:
  • 问题内容: 假设我有两个表,并且 我想在一个查询中将来自某些输入的数据插入到表中,该怎么做? 请,如果可以做到,请解释语法。 问题答案: MySQL不支持在单个INSERT语句中进行多表插入。奇怪的是,Oracle是我所知道的唯一一个…

  • 问题内容: 我想编写脚本,具有对多个插入查询的功能。让我更好地解释一下。 我有一个html形式的输入。而且我有MySQL查询要插入到表中。所以我想让我的函数为“数量”次插入此查询。 例如要插入3次。有什么建议么? 问题答案: http://dev.mysql.com/doc/refman/5.5/zh- CN/insert.html

  • 问题内容: 桌子: 我的查询: 我收到“ MySQL子查询返回多个行”错误。 我知道此查询可以使用以下查询的解决方法: 然后使用php循环遍历结果并执行以下查询以获取和回显它: 但是我认为可能会有更好的解决方案? 问题答案: 简单的解决方法是在子查询中添加一个子句: 一个更好的选择(就性能而言)是使用联接:

  • 问题内容: 我想知道以下内容: 如何从数据库中的多个表中获取数据? 有哪些类型的方法可以做到这一点? 什么是联接和工会,它们之间有何不同? 什么时候应该使用每个与其他比较? 我打算在我的应用程序(例如,PHP)中使用此功能,但是不想对数据库运行多个查询,我需要在单个查询中从多个表中获取数据的哪些选项? 注意:我正在写这篇文章是因为我希望能够链接到有关我在PHP队列中不断遇到的众多问题的书面指南,因

  • 问题内容: 您好,我正在制作一个在pdo中进行多次插入的类。 是这样的 搜索后,我发现我必须建立类似 然后用这个执行 ,其中是 问题是我还得到一个错误就如何解决呢? 这是我正在做的一小段。 问题答案: 避免并发症的简单方法是这样的 但是,这将多次执行该语句。因此,最好创建一个较长的单个查询来执行此操作。 这是我们如何执行此操作的示例。

  • 问题内容: 我有这3张表。 我创建了用于创建订单的表单,其中填写了订单(日期)的信息以及完成订单的人。在我的表单中,有一个表格可供我选择员工并获取其ID。我想知道是否可以通过一个查询将表Order和completelyBy插入表中。 使用两个插入内容或使用答案中的代码之间在有效性上有什么区别吗? 问题答案: 这可以使用修改公共表表达式的数据来完成: 第一部分插入表中并返回插入的ID。然后,第二部分