Cum pentru a selecta înregistrări dintr-un Postgres masă, folosind o COMANDA DE o declarație pe un jsonb coloană care indică spre o altă masă

0

Problema

Am doua tabele, characteristics și students.

caracteristici

 id      name          value
----    ------        -------
 1      country       england
 2      country       brazil
 3      games         football
 4      games         baseball
 5      country       india
 .        .             .
 .        .             .

elevii

 first_name      age       character_values
------------    -----     ------------------
  Jason          12         [1,4]
  Mark           14         [1,3] 
  Kunal          10         [5,3] 
   .              .           .
   .              .           .
   .              .           .

La characteristics tabelul are trei coloane unde id coloana este o auto-increment domeniu. La name reprezintă numele de o caracteristică specifică și value indică informația respectivă despre caracteristic.

La students tabelul conține detalii despre fiecare elev. La character_value domeniul în students masa este un jsonb domeniu. Fiecare element în jsonb matrice este un ID care punctele corespunzătoare caracteristice ID în characteristics masă.

(de exemplu, dacă un elev este din țara de india, apoi ID-ul 5 este anexată la character_values jsonb matrice împotriva respectiv numele elevului)

Presupunând că fiecare elev poate face parte doar la o singură țară, cum pot selecta o listă de studenți în timp ce comanda rezultatul de numele țării de care aparțin?

database jsonb postgresql sql
2021-11-21 18:58:49
1

Cel mai bun răspuns

1

Vă puteți alătura tabele cu jsonb_array_elements:

select c.*, s.first_name from characteristics c join students s on exists 
  (select 1 from jsonb_array_elements(s.character_values) v where v.value::int = c.id)

Ieșire:

id numele valoarea first_name
1 tara anglia Jason
1 tara anglia Mark
3 jocuri fotbal Mark
3 jocuri fotbal Kunal
4 jocuri baseball Jason
5 tara india Kunal
2021-11-21 19:12:50

De ce ai folosi o SELECTAȚI 1 în loc de SELECT *? Vreun motiv anume?
Vinay

@Vinay select 1 este convenția pentru exists subinterogări.
Ajax1234

În alte limbi

Această pagină este în alte limbi

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................