2017-02-12 6 views
0

Ich arbeite mit zwei Tabellen:Graf von Table1_IDs in Table2_arrays

CREATE TABLE Table1 
(
id int, 
name varchar 
) 

CREATE TABLE Table2 
(
id int, 
name varchar, 
link array<int> 
) 

Table2.link enthält Werte, die zu Table1.id entsprechen. Ich würde gerne zählen, wie oft jede Table1.id in einer Instanz von Table2.link erscheint. Dies wäre trivial mit Zellverweisen in Excel, aber ich kann nicht herausfinden, wie man es mit einer SQL-Abfrage macht.

+2

Was bedeutet "Array"? Das ist kein nativer SQL-Datentyp. –

+0

@ luke.samuel.mccarthy Ich schlage vor, hier eine detailliertere Beschreibung von Tabellen zu geben, oder DDL, die beschreiben könnte, wie Tabellen aussehen. Es wird helfen, das Problem zu verstehen. – Kamil

+0

Können Sie bitte einige Beispiele für beide Tabellen posten – Tajinder

Antwort

1

Presto

select * 
from  (select l.id   
        ,count(*) as cnt 
      from  Table2 cross join unnest (link) as l(id) 
      group by l.id  
     ) t2 
where  t2.id in (select id from Table1) 
order by id 

presto:default> select * 
      -> from  (select l.id 
      ->     ,count(*) as cnt 
      ->   from  Table2 cross join unnest (link) as l(id) 
      ->   group by l.id 
      ->   ) t2 
      -> where  t2.id in (select id from Table1) 
      -> order by id; 
id | cnt 
----+----- 
    1 | 7 
    2 | 5 
    3 | 4 
(3 rows) 

PostgreSQL Demo

create table Table1 (id int); 
create table Table2 (arr int[]); 

insert into Table1 values 
    (1),(2),(3) 
; 

insert into Table2 values 
    (array[1,5]),(array[1,3]),(array[1,2,3]),(array[2,3]) 
    ,(array[1,2,4]),(array[1,2]),(array[1,3,5]),(array[1,2,4]) 
; 

select * 
from  (select unnest(arr) as id    
        ,count(*) as cnt 
      from  Table2 
      group by id  
     ) t2 
where  t2.id in (select id from Table1) 
order by id 

+----+-----+ 
| id | cnt | 
+----+-----+ 
| 1 | 7 | 
+----+-----+ 
| 2 | 5 | 
+----+-----+ 
| 3 | 4 | 
+----+-----+ 
+0

Bitte überprüfen Sie die Presto-Version –

+0

Presto-Code wurden verifiziert –

+0

Das hat es getan. Vielen Dank, schätze die Hilfe wirklich –