【发布时间】:2018-09-26 14:40:19
【问题描述】:
我们有一个 sql 查询,我们使用 3 个内部连接和一个非常复杂的 where 条件。我们有以下 4 个表:
表 1:Avis - 它是表 2 的 1:n(绑定在 Avis.Id=Item.AvisFk)
表 2:项目 - 它是表 3 的 1:n(绑定在 Item.Id=Routesection.ItemFk)
表 3:Routesection - 它是表 4 的 n:1(绑定在 Routesection.TourFk=Tour.Id)
表 4:游览
现在我们使用 WHERE 条件过滤一些日期、位置等。现在我们遇到了问题,我们不想拥有一些特殊的 Item-Id。我们得到一些错误的结果。 存在具有许多项目的 Avis。现在我们要过滤所有至少有一个不想要的项目的 Avis。但来自 Tour-Query。
我试过了
WHERE (SELECT Count(*) FROM Item WHERE OemFk=5003 AND AvisFK = Avis.Id) = 0
但是我们必须使用一些 GROUP BY's 并且我们将所有 Avis 分组到一个 Tour.Id 以便我们每次都得到一个“真实”,因为在这个 Tour 中有一些 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;
好的,现在我要查询 Tour 表。结果应该只有 Tour 1。期望的结果是获得其他表上的内部连接与特殊条件无关的游览。条件是:如果一个项目具有 OemFk 5003,那么来自同一个 Avis(在本例中为 3 和 4)的所有项目都必须被过滤掉。 SELECT 引用了近 40 列,WHERE 包括 5 个以上的条件,并且 SELECT 中的每一列也在 GROUP BY 内,所以我试图只显示所需的最小值而不是完整的查询。
【问题讨论】:
-
样本数据和期望的结果真的很有帮助。
-
如果可能,尝试添加sql fiddle。
-
这不只是需要一个“有”子句吗?
-
在未发布查询时很难帮助查询。只是说'
-
使用 WITH 命令将您的表格预过滤为 4 个 CTE 表达式,然后使用您想要的数据,加入 CTE 'tables' - 是一个建议
标签: sql sql-server tsql group-by where-clause