【问题标题】:SQL Query to select only if there are a certain number of entries仅当有一定数量的条目时才选择 SQL 查询
【发布时间】:2014-02-16 02:40:10
【问题描述】:

SQL Server 2008 R2

这很难解释,但我不愿意提供实际细节,因为这是我雇主的项目。把一个场景放在一起:我们的数据库跟踪车轮、它们的规格以及它们何时被安装到汽车上。我需要为连接到具有所有车轮的汽车上的每个车轮提取记录。我的Cars 表中有一个字段告诉我该条目是什么类型的汽车,我的CarTypes 表中有一个条目告诉我每种类型的汽车有多少个轮子,我的WheelPositions 表中有一个条目用于汽车上每个可能放置车轮的位置。

我还需要生成第二个类似的查询,以返回缺少车轮的汽车列表。

目前,我的查询如下所示:

SELECT
  Cars.ID AS [CarID]
  ,CarTypes.Name AS [CarType]
  ,Wheels.ID AS [WheelID]
  ,WheelPositions.[Index] AS [PosIndex]
FROM
  Cars
  LEFT JOIN CarTypes ON Cars.Type = CarTypes.Name
  LEFT JOIN Wheels ON Cars.ID = Wheels.CarID
  LEFT JOIN WheelPositions ON Wheels.Position = WheelPositions.Value
    AND Wheels.Shop = WheelPositions.Shop
WHERE
  Cars.Visible = 'True'

这给了我一个连接到汽车的所有车轮的列表,但我不知道如何修改它以过滤掉缺少车轮的汽车或在不完整的汽车上包括空置位置。

为了清楚起见,我正在描述两个单独的查询,并且正在寻求任何帮助。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    CarTypes 有一个包含轮数的字段。您可以在聚合中使用它:

    SELECT Cars.ID AS [CarID], CarTypes.Name AS [CarType]
    FROM Cars LEFT JOIN
         CarTypes
         ON Cars.Type = CarTypes.Name LEFT JOIN
         Wheels
         ON Cars.ID = Wheels.CarID LEFT JOIN
         WheelPositions
         ON Wheels.Position = WheelPositions.Value AND Wheels.Shop = WheelPositions.Shop
    WHERE Cars.Visible = 'True'
    GROUP BY Cars.ID, CarTypes.Name, CarTypes.NumWheels
    HAVING count(WheelPositions.Value) = CarTypes.NumWheels;
    

    我不太清楚如何判断轮子丢失。这是假设字段WheelPositions.Value 为NULL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-22
      • 2019-06-26
      • 1970-01-01
      • 2011-12-17
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多