我是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。
有人知道如何制定此更改吗?
答案 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)
- 该团队会根据您的说明符合条件。
查询的其余部分只是从mannschaft
和person
中匹配的行中提取详细信息。
如果没有其他车辆比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;