PostgreSQL - 如何查询“结果全部”?

时间:2012-11-30 15:46:25

标签: sql postgresql relational-division

我是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的related_einsatz。

而不是这个,我想选择“related_mannschaften”每个mannschaft,这是来自bergefahrzeug的related_einsatz WITH EACH。

有人知道如何制定此更改吗?

2 个答案:

答案 0 :(得分: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)在所有部署中使用了多少bergfahrzeug个山地车辆(mannschaft) (einsatz):count(DISTINCT e.fahrzeug)

    如果该号码与表格bergfahrzeug中的点数相匹配:(SELECT count(*) FROM bergefahrzeug) - 该团队会根据您的说明符合条件。

  • 查询的其余部分只是从mannschaftperson中匹配的行中提取详细信息。

如果没有其他车辆比bergfahrzeuge,你根本不需要这条线路:

JOIN   bergefahrzeug b ON b.id = e.fahrzeug

基本上,这是关系师的特殊应用。关于这个相关问题的话题还有很多: How to filter SQL results in a has-many-through relation

答案 1 :(得分: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;