Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于连接10行的更高效的SQL自连接?_Sql_Postgresql - Fatal编程技术网

用于连接10行的更高效的SQL自连接?

用于连接10行的更高效的SQL自连接?,sql,postgresql,Sql,Postgresql,我数据库中的每一行都是JSON数据。我需要根据“匹配”字段连接行,我相信这意味着自连接表。将有整整10行具有相同的“匹配”字段,因此这意味着我必须加入10次。这是难以置信的低效。有没有更有效的方法来完成下面的查询 SELECT P1.data->>'Reference_Name', P2.data->>'Reference_Name', P3.data->>'Reference_Name', P4.data->>'Reference_Name',

我数据库中的每一行都是JSON数据。我需要根据“匹配”字段连接行,我相信这意味着自连接表。将有整整10行具有相同的“匹配”字段,因此这意味着我必须加入10次。这是难以置信的低效。有没有更有效的方法来完成下面的查询

SELECT
P1.data->>'Reference_Name',
P2.data->>'Reference_Name',
P3.data->>'Reference_Name',
P4.data->>'Reference_Name',
P5.data->>'Reference_Name',
P6.data->>'Reference_Name',
P7.data->>'Reference_Name',
P8.data->>'Reference_Name',
P9.data->>'Reference_Name',
P10.data->>'Reference_Name'
from match_player_data P1
INNER JOIN match_player_data P2
on P1.data->>'Match' = P2.data->>'Match'
and P1.data->>'Reference_Name' <> P2.data->>'Reference_Name'
INNER JOIN match_player_data P3
on P1.data->>'Match' = P3.data->>'Match'
    and P1.data->>'Reference_Name' <> P3.data->>'Reference_Name'
    and P2.data->>'Reference_Name' <> P3.data->>'Reference_Name'
INNER JOIN match_player_data P4
on P1.data->>'Match' = P4.data->>'Match'
    and P4.data->>'Reference_Name' <> P1.data->>'Reference_Name'
    and P4.data->>'Reference_Name' <> P2.data->>'Reference_Name'
    and P4.data->>'Reference_Name' <> P3.data->>'Reference_Name'
INNER JOIN match_player_data P5
on P1.data->>'Match' = P5.data->>'Match'
    and P5.data->>'Reference_Name' <> P1.data->>'Reference_Name'
    and P5.data->>'Reference_Name' <> P2.data->>'Reference_Name'
    and P5.data->>'Reference_Name' <> P3.data->>'Reference_Name'
    and P5.data->>'Reference_Name' <> P4.data->>'Reference_Name'
INNER JOIN match_player_data P6
on P1.data->>'Match' = P6.data->>'Match'
    and P6.data->>'Reference_Name' <> P1.data->>'Reference_Name'
    and P6.data->>'Reference_Name' <> P2.data->>'Reference_Name'
    and P6.data->>'Reference_Name' <> P3.data->>'Reference_Name'
    and P6.data->>'Reference_Name' <> P4.data->>'Reference_Name'
    and P6.data->>'Reference_Name' <> P5.data->>'Reference_Name'
INNER JOIN match_player_data P7
on P1.data->>'Match' = P7.data->>'Match'
    and P7.data->>'Reference_Name' <> P1.data->>'Reference_Name'
    and P7.data->>'Reference_Name' <> P2.data->>'Reference_Name'
    and P7.data->>'Reference_Name' <> P3.data->>'Reference_Name'
    and P7.data->>'Reference_Name' <> P4.data->>'Reference_Name'
    and P7.data->>'Reference_Name' <> P5.data->>'Reference_Name'
    and P7.data->>'Reference_Name' <> P6.data->>'Reference_Name'
INNER JOIN match_player_data P8
on P1.data->>'Match' = P8.data->>'Match'
    and P8.data->>'Reference_Name' <> P1.data->>'Reference_Name'
    and P8.data->>'Reference_Name' <> P2.data->>'Reference_Name'
    and P8.data->>'Reference_Name' <> P3.data->>'Reference_Name'
    and P8.data->>'Reference_Name' <> P4.data->>'Reference_Name'
    and P8.data->>'Reference_Name' <> P5.data->>'Reference_Name'
    and P8.data->>'Reference_Name' <> P6.data->>'Reference_Name'
    and P8.data->>'Reference_Name' <> P7.data->>'Reference_Name'
INNER JOIN match_player_data P9
on P1.data->>'Match' = P9.data->>'Match'
    and P9.data->>'Reference_Name' <> P1.data->>'Reference_Name'
    and P9.data->>'Reference_Name' <> P2.data->>'Reference_Name'
    and P9.data->>'Reference_Name' <> P3.data->>'Reference_Name'
    and P9.data->>'Reference_Name' <> P4.data->>'Reference_Name'
    and P9.data->>'Reference_Name' <> P5.data->>'Reference_Name'
    and P9.data->>'Reference_Name' <> P6.data->>'Reference_Name'
    and P9.data->>'Reference_Name' <> P7.data->>'Reference_Name'
    and P9.data->>'Reference_Name' <> P8.data->>'Reference_Name'
INNER JOIN match_player_data P10
on P1.data->>'Match' = P10.data->>'Match'
    and P10.data->>'Reference_Name' <> P1.data->>'Reference_Name'
    and P10.data->>'Reference_Name' <> P2.data->>'Reference_Name'
    and P10.data->>'Reference_Name' <> P3.data->>'Reference_Name'
    and P10.data->>'Reference_Name' <> P4.data->>'Reference_Name'
    and P10.data->>'Reference_Name' <> P5.data->>'Reference_Name'
    and P10.data->>'Reference_Name' <> P6.data->>'Reference_Name'
    and P10.data->>'Reference_Name' <> P7.data->>'Reference_Name'
    and P10.data->>'Reference_Name' <> P8.data->>'Reference_Name'
    and P10.data->>'Reference_Name' <> P9.data->>'Reference_Name'
预期产出:

{'Match':'1', 'Reference_Name":"a"}, {'Match':'1', 'Reference_Name":"b"}, {'Match':'1', 'Reference_Name":"c"}, {'Match':'1', 'Reference_Name":"d"},{'Match':'1', 'Reference_Name":"e"}, {'Match':'1', 'Reference_Name":"f"},{'Match':'1', 'Reference_Name":"g"}, {'Match':'1', 'Reference_Name":"h"},{'Match':'1', 'Reference_Name":"j"}, {'Match':'1', 'Reference_Name":"k"}
{'Match':'2', 'Reference_Name":"b"}

您可以将所有内容聚合到一个数组中:

select jsonb_agg(data) as matches
from match_player_data
group by data ->> 'Match'
如果确实需要将每个“匹配”作为单独的列,只需从数组中提取元素:

select matches -> 0 ->> 'Match' as match_number,
       matches -> 0 ->> 'Reference_Name' as reference_name_1,
       matches -> 1 ->> 'Reference_Name' as reference_name_2,
       matches -> 2 ->> 'Reference_Name' as reference_name_3,
       ....
from (
  select jsonb_agg(data) as matches
  from match_player_data
  group by data ->> 'Match'
) t
如果您对其他内容不感兴趣,也可以收集姓名:

select match_number,
       names[1] as reference_name_1,
       names[2] as reference_name_2,
       names[3] as reference_name_3,
       ....
from (
  select data ->> 'Match' as match_number, 
         array_agg(data ->> 'Reference_Name') as names
  from match_player_data
  group by data ->> 'Match'
) t

注意:您可以避免
10>
而不是
@a_horse_,我添加了一个简单的输入和输出,对结果集进行了code>(~3M)排列。基本上就是找到匹配的行并将它们转换成一行,每行有10个不同的json blobcolumn@wildplasser我尝试了这个更改(可能已经改进了),但是查询仍然非常慢(太慢了,我还没有让它完成)@一匹没有名字的马顺便说一句,想要改变格式的原因是我可以把数据读入一个类似这样的数据框:这就是我需要的,谢谢。有没有办法使用您给出的第一个查询并重命名每个字段的元素?有很多字段,因此手动重命名它们实际上是一项繁重的工作。@lexxish:不,您必须为所选的每一列编写一个列别名。是否可能影响数据“分组依据”的顺序?例如,我有一个“Win_Status”列,我希望获胜的团队被分组在一起,这样你就有5个获胜列,然后是5个失败列。
select match_number,
       names[1] as reference_name_1,
       names[2] as reference_name_2,
       names[3] as reference_name_3,
       ....
from (
  select data ->> 'Match' as match_number, 
         array_agg(data ->> 'Reference_Name') as names
  from match_player_data
  group by data ->> 'Match'
) t