我在編寫SQL查詢時遇到困難。這是3個表的結構,表Race_ClassificationType是多對多表。SQL多對多關係
Table Race
----------------------------
RaceID
Name
Table Race_ClassificationType
----------------------------
Race_ClassificationTypeID
RaceID
RaceClassificationID
Table RaceClassificationType
----------------------------
RaceClassificationTypeID
Name
我想要做的就是與某些類別的比賽。
CREATE TYPE [dbo].[RaceClassificationTypeTable]
AS TABLE
(
RaceClassificationTypeID INT NULL
);
GO
CREATE PROCEDURE USP_GetRaceList
(@RaceClassificationTypeTable AS [RaceClassificationTypeTable] READONLY,
@RaceTypeID INT = NULL,
@IsCompleted BIT = NULL,
@MinDateTime DATETIME = NULL,
@MaxDateTime DATETIME = NULL,
@MaxRaces INT = NULL)
WITH RECOMPILE
AS
BEGIN
SET NOCOUNT ON;
SELECT DISTINCT
R.[RaceID]
,R.[RaceTypeID]
,R.[Name]
,R.[Abbreviation]
,R.[DateTime]
,R.[IsCompleted]
FROM [Race] R,[Race_ClassificationType] R_CT, [RaceClassificationType] RCT
WHERE (R.[RaceTypeID] = @RaceTypeID OR @RaceTypeID IS NULL)
AND (R.[IsCompleted] = @IsCompleted OR @IsCompleted IS NULL)
AND (R.[DateTime] >= @MinDateTime OR @MinDateTime IS NULL)
AND (R.[DateTime] <= @MaxDateTime OR @MaxDateTime IS NULL)
AND (R.RaceID = R_CT.RaceID)
AND (R_CT.RaceClassificationTypeID = RCT.RaceClassificationTypeID)
AND (RCT.RaceClassificationTypeID IN (SELECT DISTINCT T.RaceClassificationTypeID FROM @RaceClassificationTypeTable T))
ORDER BY [DateTime] DESC
OFFSET 0 ROWS FETCH NEXT @MaxRaces ROWS ONLY
END
GO
由於它是該存儲過程犯規正確地工作,因爲它返回具有至少一個分類類型ID所有種族:結果是由具有保持所期望的分類的表值參數存儲過程返回在分類類型ID的表值參數中(由於IN子句)。我希望存儲過程僅返回具有表值參數中提供的所有分類的種族。
實施例:在RaceClassificationTypeTable參數
RaceClassificationTypeID RaceID
3 92728
3 92729
8 92729
29 92729
12 92729
2 92729
3 92730
8 92730
8 92731
1 92731
RaceClassificationTypeIDs:3和8
OUTPUT:所有與RaceClassificationID 3和8中的座圈和任選的任何其它(2,29,12)
這意味着只應該返回92729和92730比賽,因爲這是例子中的所有比賽都返回。