0

私は PostgreSQL を初めて使用し、次のクエリに問題があります。

WITH relevant_einsatz AS (
    SELECT einsatz.fahrzeug,einsatz.mannschaft 
    FROM einsatz 
    INNER JOIN bergefahrzeug ON einsatz.fahrzeug = bergefahrzeug.id
),
relevant_mannschaften AS (
    SELECT DISTINCT relevant_einsatz.mannschaft
    FROM relevant_einsatz
    WHERE relevant_einsatz.fahrzeug IN (SELECT id FROM bergefahrzeug)
    )
SELECT mannschaft.id,mannschaft.rufname,person.id,person.nachname 
FROM mannschaft,person,relevant_mannschaften WHERE mannschaft.leiter = person.id AND relevant_mannschaften.mannschaft=mannschaft.id;

このクエリは基本的に機能していますが、「relevant_mannschaften」では、現在、少なくとも 1 つの bergefahrzeug を含む related_einsatz にある各 mannschaft を選択しています。

これの代わりに、bergefahrzeug からの related_einsatz WITH EACH にあった各 mannschaft を「relevant_mannschaften」に選択したいと思います。

この変更を定式化する方法を知っている人はいますか?

4

2 に答える 2

1

あなたが提供する情報はかなり初歩的です。しかし、私のメンタリストのスキルに合わせて、四肢に出て、このもつれのないバージョンのクエリの方がはるかに速く仕事をすると思います。

SELECT m.id, m.rufname, p.id, p.nachname
FROM   person        p 
JOIN   mannschaft    m ON m.leiter = p.id
JOIN (
    SELECT e.mannschaft
    FROM   einsatz       e
    JOIN   bergefahrzeug b ON b.id = e.fahrzeug -- may be redundant
    GROUP  BY e.mannschaft
    HAVING count(DISTINCT e.fahrzeug)
         = (SELECT count(*) FROM bergefahrzeug)
    ) e ON e.mannschaft = m.id

説明:

  • サブクエリでは、チーム ( ) がすべての展開 ( ) で使用した山岳車両 ( ) のe数を数えます。DISTINCTbergfahrzeugmannschafteinsatzcount(DISTINCT e.fahrzeug)

    その数が表の数と一致する場合bergfahrzeug: (SELECT count(*) FROM bergefahrzeug)- チームはあなたの説明に従って資格を得ます。

  • クエリの残りの部分は、mannschaftとの一致する行から詳細をフェッチするだけpersonです。

bergfahrzeuge 以外の車両がプレイされていない場合、この行はまったく必要ありません。

JOIN   bergefahrzeug b ON b.id = e.fahrzeug

基本的に、これは関係分割の特殊なアプリケーションです。この関連する質問の下のトピックの詳細:
How to filter SQL results in a has-many-through relationship

于 2012-11-30T19:32:27.667 に答える
0

説明の仕方がわかりませんが、ある日誰かが質問した場合に備えて、この問題をどのように解決したかの例を次に示します。

WITH dfz AS (
    SELECT DISTINCT fahrzeug,mannschaft FROM einsatz WHERE einsatz.fahrzeug IN (SELECT id FROM bergefahrzeug)
), abc AS (
    SELECT DISTINCT mannschaft FROM dfz
), einsatzmannschaften AS (
    SELECT abc.mannschaft FROM abc WHERE (SELECT sum(dfz.fahrzeug) FROM dfz WHERE dfz.mannschaft = abc.mannschaft) = (SELECT sum(bergefahrzeug.id) FROM bergefahrzeug)
)
SELECT mannschaft.id,mannschaft.rufname,person.id,person.nachname
FROM mannschaft,person,einsatzmannschaften WHERE mannschaft.leiter = person.id AND einsatzmannschaften.mannschaft=mannschaft.id;
于 2012-11-30T18:46:40.057 に答える