Wie zähle ich die Anzahl der Bezugsdatensätze?

Ich habe 2 verwandte Modelle, model_A und model_B. Es besteht eine 1:n-Beziehung zwischen ihnen, eine Zeile in model_A kann mehrere verwandte Zeilen in model_B haben.

model_A ist ein view, erstellt mit CREATE OR REPLACE VIEW view_name AS (...
model_B ist eine normale Tabelle.

Ich möchte, dass eine der Spalten von model_A die Anzahl der Bezugsdatensätze in model_B enthält. Wie kann ich das erreichen?

Definition von model_A:

CREATE OR REPLACE VIEW prestazioni_preventivate AS (
select 
row_number() OVER (ORDER BY res_valutazione.id, prestazione_preventivata) as id,
generate_series(1,res_prestazione.occorrenze_totali) as prestazione_preventivata,
res_valutazione.id AS valutazione_id,
res_valutazione.stringa_valutazione, 
res_valutazione.studio_id, 
res_valutazione.overhead, 
res_valutazione.accepted_overhead,
res_braccio.id AS braccio_id,
res_braccio.seleziona_braccio,
res_braccio.n_pazienti,
res_prestazione.id as prestazione_id,
tipo_prestazione.name AS prestazione,
tipo_prestazione.id AS tipo_prestazione_id,
res_prestazione.is_conditional,
res_week.id AS week,
res_prestazione.quantita,
res_prestazione.occorrenze_totali
from 
res_valutazione 
LEFT OUTER JOIN res_braccio ON res_braccio.valutazione_id = res_valutazione.id
LEFT OUTER JOIN res_prestazione ON res_prestazione.braccio_id = res_braccio.id
LEFT OUTER JOIN tipo_prestazione ON res_prestazione.tipo_prestazione_ids = tipo_prestazione.id
LEFT OUTER JOIN res_week ON res_valutazione.id = res_week.valutazione_id AND res_braccio.id = res_week.braccio_id AND res_prestazione.id = res_week.prestazione_id
LEFT OUTER JOIN generate_series(1,res_prestazione.occorrenze_totali) as prestazione_preventivata on true
WHERE res_valutazione.studio_id is not  null
AND
res_valutazione.accepted_overhead is TRUE
ORDER BY res_valutazione.studio_id, res_braccio.seleziona_braccio         )

Definition von model_B:

> describe eroga_prestazione;
+-----------------------------+-----------------------------+-----------------------------------------------------------------+
| Column                      | Type                        | Modifiers                                                       |
|-----------------------------+-----------------------------+-----------------------------------------------------------------|
| id                          | integer                     |  not null default nextval('eroga_prestazione_id_seq'::regclass) |
| data                        | timestamp without time zone |                                                                 |
| paziente_id                 | integer                     |                                                                 |
| studio_id                   | integer                     |                                                                 |
| prestazione_ids             | integer                     |                                                                 |
| costo_tariffario            | double precision            |                                                                 |
| onorario                    | double precision            |                                                                 |
| company_id                  | integer                     |                                                                 |
| currency_id                 | integer                     |  not null                                                       |
| create_uid                  | integer                     |                                                                 |
| create_date                 | timestamp without time zone |                                                                 |
| write_uid                   | integer                     |                                                                 |
| write_date                  | timestamp without time zone |                                                                 |
| supporto_sanitario_diretto  | double precision            |                                                                 |
| medico_id                   | integer                     |                                                                 |
| infermiere_id               | integer                     |                                                                 |
| tecnico_id                  | integer                     |                                                                 |
| percentuale_infermiere      | integer                     |                                                                 |
| quota_infermiere            | double precision            |                                                                 |
| percentuale_tecnico         | integer                     |                                                                 |
| quota_tecnico               | double precision            |                                                                 |
| prestazione_preventivata_id | integer                     |                                                                 |
+-----------------------------+-----------------------------+-----------------------------------------------------------------+
Indexes:
    "eroga_prestazione_pkey" PRIMARY KEY, btree (id)
    "eroga_prestazione_company_id_index" btree (company_id)
Foreign-key constraints:
    "eroga_prestazione_company_id_fkey" FOREIGN KEY (company_id) REFERENCES res_company(id) ON DELETE SET NULL
    "eroga_prestazione_create_uid_fkey" FOREIGN KEY (create_uid) REFERENCES res_users(id) ON DELETE SET NULL
    "eroga_prestazione_currency_id_fkey" FOREIGN KEY (currency_id) REFERENCES res_currency(id) ON DELETE RESTRICT
    "eroga_prestazione_infermiere_id_fkey" FOREIGN KEY (infermiere_id) REFERENCES sc_personale(id) ON DELETE SET NULL
    "eroga_prestazione_medico_id_fkey" FOREIGN KEY (medico_id) REFERENCES sc_personale(id) ON DELETE SET NULL
    "eroga_prestazione_paziente_id_fkey" FOREIGN KEY (paziente_id) REFERENCES res_partner(id) ON DELETE SET NULL
    "eroga_prestazione_prestazione_ids_fkey" FOREIGN KEY (prestazione_ids) REFERENCES tipo_prestazione(id) ON DELETE SET NULL
    "eroga_prestazione_studio_id_fkey" FOREIGN KEY (studio_id) REFERENCES res_studio(id) ON DELETE SET NULL
    "eroga_prestazione_tecnico_id_fkey" FOREIGN KEY (tecnico_id) REFERENCES sc_personale(id) ON DELETE SET NULL
    "eroga_prestazione_write_uid_fkey" FOREIGN KEY (write_uid) REFERENCES res_users(id) ON DELETE SET NULL
Referenced by:
    TABLE "prestazione_personale_rel" CONSTRAINT "prestazione_personale_rel_eroga_prestazione_id_fkey" FOREIGN KEY (eroga_prestazione_id) REFERENCES eroga_prestazione(id) ON DELETE CASCADE

In model_B (eroga_prestazione) lautet der Verweis auf model_A (prestazioni_preventivate) prestazione_preventivata_id

Vieles davon wird durch das Odoo ORM erstellt, ich versteh nicht, warum prestazione_preventivata_id kein Fremdschlüssel in model_B (eroga_prestazione) ist.

Auf welche Spalte in prestazioni_preventivate verweist eroga_prestazione.prestazione_preventivata_id? Etwa auf id? Das wäre verhängnisvoll, denn diese Spalte ist berechnet, und der Wert kann sich jederzeit ändern, wenn jemand Zeilen in eine der der View zugrundeliegenden Tabellen einfügt. Eine View kann keinen eindeutigen Schlüssel haben, deshalb kann es auch keinen Fremdschlüssel geben, der auf eine View verweist.

Übrigens, ein ORDER BY hat in einer Viewdefinition nichts verloren.

Zur Lösung der gestellten Frage könnte man die View mit diesem SELECT definieren:

SELECT guppy.*,
       count(ep.id) AS numero_eroga_prestazione
FROM (/* bisherige Viewdefinition */) AS guppy
   LEFT JOIN eroga_prestazione AS ep
      ON guppy.id = ep.prestazione_preventivata_id;

Aber, wie gesagt, das Ganze ist höchst bedenklich.

Dieses Thema wurde automatisch 60 Tage nach der letzten Antwort geschlossen. Es sind keine neuen Antworten mehr erlaubt.