Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak uzyskać wiele rekordów w jednym rekordzie na podstawie relacji?

Pierwotne pytanie dotyczyło bazy danych, ale być może jest to dobre miejsce na podanie bardziej ogólnej odpowiedzi. To częste pytanie. Pojęcie, które opisujesz, jest często określane jako „Połączenie grupowe”. Nie ma standardowego rozwiązania w SQL-92 lub SQL-99. Potrzebujesz więc rozwiązania specyficznego dla dostawcy.

  • MySQL - Użyj wbudowanej funkcji GROUP_CONCAT. W twoim przykładzie chciałbyś coś takiego:
wybierz o.ID, o.Adres, o.OtherDetails, GROUP_CONCAT( concat(e.imię, ' ', e.nazwisko)) jako Pracownicyod pracowników e wewnętrzna organizacja przyłączenia o na o.org_id=e.org_idgroup przez o .org_id
  • PostgreSQL - PostgreSQL 9.0 jest równie prosty teraz, gdy wbudowany jest string_agg(wyrażenie, delimiter). Tutaj jest z „przecinkiem” między elementami:
wybierz o.ID, o.Adres, o.OtherDetails, STRING_AGG( (e.imię || ' ' || e.nazwisko), ', ' ) jako Pracownicyod pracowników e wewnętrzna organizacja przyłączenia o na o.org_id=e.org_idgroup od o.org_id

PostgreSQL przed wersją 9.0 umożliwia definiowanie własnych funkcji agregujących za pomocą CREATE AGGREGATE. Nieco więcej pracy niż MySQL, ale znacznie bardziej elastyczny. Zobacz to inny post po więcej szczegółów. (Oczywiście PostgreSQL 9.0 i nowsze również mają tę opcję.)

  • Wyrocznia - ten sam pomysł przy użyciu LISTAGG .

  • Serwer MS SQL - ten sam pomysł przy użyciu STRING_AGG

  • Rozwiązanie awaryjne - w innych technologiach baz danych lub w bardzo bardzo starych wersjach technologii wymienionych powyżej nie masz tych funkcji łączenia grup. W takim przypadku utwórz procedurę składowaną, która pobiera org_id jako dane wejściowe i wyprowadza połączone nazwiska pracowników. Następnie użyj tej procedury składowanej w zapytaniu. Niektóre z innych odpowiedzi tutaj zawierają pewne szczegóły dotyczące pisania procedur składowanych, takich jak te.

wybierz o.ID, o.Adres, o.OtherDetails, MY_CUSTOM_GROUP_CONCAT_PROCEDURE( o.ID ) jako Pracownicy z organizacji o


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql - WSTAW zakres dat do kolumn dat JEŚLI daty nie pokrywają się z istniejącymi

  2. Jak przekonwertować datę UTC na lokalną strefę czasową w MySql Select Query

  3. Jak uciec dosłowny znak procentu, gdy włączona jest opcja NO_BACKSLASH_ESCAPES?

  4. pojawia się błąd składni podczas tworzenia funkcji

  5. MySQL - auto dekrementacja wartości