sql >> Databáze >  >> RDS >> PostgreSQL

Vyberte více hodnot řádků do jednoho řádku s klauzulemi s více tabulkami

Pokud má každý atribut pro uživatele pouze jednu hodnotu, můžete začít vytvořením řídké matice:

SELECT user_id
      ,CASE WHEN attrib_id = 1 THEN value ELSE NULL END AS attrib_1_val
      ,CASE WHEN attrib_id = 2 THEN value ELSE NULL END AS attrib_2_val
  FROM UserAttribute;

Potom komprimujte matici pomocí agregační funkce:

SELECT user_id
      ,MAX(CASE WHEN attrib_id = 1 THEN value ELSE NULL END) AS attrib_1_val
      ,MAX(CASE WHEN attrib_id = 2 THEN value ELSE NULL END) AS attrib_2_val
  FROM UserAttribute
  GROUP BY user_id;

V reakci na komentář, hledání podle názvu atributu spíše než id:

SELECT ua.user_id
      ,MAX(CASE WHEN a.attrib_name = 'attrib1' THEN ua.value ELSE NULL END) AS attrib_1_val
      ,MAX(CASE WHEN a.attrib_name = 'attrib2' THEN ua.value ELSE NULL END) AS attrib_2_val
  FROM UserAttribute ua
  JOIN Attribute a ON (a.attrib_id = ua.attrib_id)
  WHERE a.attrib_name IN ('attrib1', 'attrib2')
  GROUP BY ua.user_id;


  1. Co je MySQL ekvivalentem PostgreSQL EXPLAIN ANALYZE

  2. PostgreSQL Upsert (On Conflict) se stejnými hodnotami v Insert a Update

  3. EF6 s MySQL. Daný klíč nebyl ve slovníku přítomen

  4. HQL s kontrolou Null pro vztah jedna ku jedné