如何在具有 4 个表的复杂 sql 中获得正确的 SQL 结果

How to get the correct SQL result in complex sql with 4 tables

我们有一个 sql 查询,我们在其中使用了 3 个内部联接和一个非常复杂的 where-condition。我们有以下 4 tables:
Table 1: Avis - 它是 1:n 到 table 2(绑定 Avis.Id=Item.AvisFk)
Table 2: 项目 - 它是 1:n 到 table 3(绑定在 Item.Id=Routesection.ItemFk)
Table 3: Routesection - 它是 n:1 到 table 4(绑定 Routesection.TourFk=Tour.Id)
Table4:旅游

现在我们使用 WHERE 条件来过滤一些日期、位置等。现在我们遇到了问题,有一些我们不想拥有的特殊 Item-Id。我们得到了一些错误的结果。 存在具有许多项目的 Avis。现在我们要过滤所有至少有一个不需要的项目的 Avis。但是从旅游查询。

我试过了 WHERE (SELECT Count(*) FROM Item WHERE OemFk=5003 AND AvisFK = Avis.Id) = 0 但是我们必须使用一些 GROUP BY,然后我们将所有 Avis 分组到一个 Tour.Id,这样我们每次都会得到一个 'true',因为这次巡演中有些 Avis 有不需要的物品,有些则没有没...

有人知道我该如何解决这个问题吗?

编辑: 好吧,我试着给你一个基本的我真正的意思。假设我们在 Avis 中有 2 个数据行。行数:ID; (只有真正需要的)
1;
2;
然后假设我们在 Item 中有一些项目。行数:ID; AvisFk; OEMFk;
1; 1; 5001;
2; 1; 5002;
3; 2; 5003;
4; 2; 5004;
然后是Routesection(多了一些行,我这里只放了一些作为例子的参考)。行数:ID;项目Fk; TourFk;
1; 1; 1;
2; 1; 1;
3; 2; 1;
4; 2; 1;
5; 3; 2;
6; 3; 2;
7; 4; 3;
8; 4; 3;
最后但并非最不重要的巡回赛。行数:ID;
1;
2;
3;
好的,现在我要查询Tourtable。结果应该只有 Tour 1。期望的结果是获得其他 table 上的内部连接与特殊条件无关的游览。条件是:如果某件商品具有 OemFk 5003,则必须过滤掉来自同一 Avis 的所有商品(在本例中为 3 和 4)。 SELECT 引用近 40 列,WHERE 包含 5 个以上的条件,并且 SELECT 中的每一列也在 GROUP BY 中,所以我试图只显示所需的最少部分而不是完整的查询。

...there are some Avis on this Tour that have the undesired Item and some don't...

Has someone an idea how I could approach the problem?

考虑使用 WHERE EXISTS()。

@Cato 是对的,遗憾的是我无法将其标记为正确答案,因为它只是一条评论。
我设法通过 "WITH" 语句获得了正确的结果。我首先在所有 4 个表的组合 INNER JOIN 中过滤表,selected 不想要的结果作为一种 "Black List",并将其与 Tour 中的 select 的 LEFT JOIN 一起使用所有不在 WITH 结果中的结果。
现在看起来像这样:

WITH partresult AS
(SELECT TourFk
 FROM Routesection r
 INNER JOIN Item i ON r.ItemFk=i.ID
 INNER JOIN Avis a ON a.ID=i.AvisFk
 INNER JOIN Tour t ON r.TourFk=t.ID
 WHERE (put some strange selections here ;)
        AND i.OemFk=5003)
SELECT t.ID, etc.
FROM Tour t
INNER JOIN Routesection r ON t.ID=r.TourFk
INNER JOIN Item i ON i.ID=r.ItemFk
INNER JOIN Avis a ON a.ID=i.AvisFk
LEFT JOIN partresult p ON t.ID=p.TourFk
WHERE p.TourFK IS NULL
      AND (nearly the same selections as above, so the server is a little bit faster)
GROUP BY t.ID, etc.