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”中,我目前正在选择每个 mannschaft,它已经到了一个至少有 1 个 bergefahrzeug 的相关的einsatz。

而不是这个,我想选择每个 mannschaft 到“relevant_mannschaften”,这些 mannschaft 已经从 bergefahrzeug 到了一个相关的 einsatz WITH EACH。

有人知道如何制定这种变化吗?

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了多少DISTINCT山地车( ):bergfahrzeugmannschafteinsatzcount(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 回答