我有两张桌子:
CREATE TABLE Users(
UserId UNIQUEIDENTIFIER NOT NULL PRIMARY KEY,
UserName NVARCHAR(200) NOT NULL,
-- some other columns
CurrentSubscriptionId UNIQUEIDENTIFIER NULL,
)
CREATE TABLE Subscriptions(
SubscriptionId UNIQUEIDENTIFIER NOT NULL PRIMARY KEY,
UserId UNIQUEIDENTIFIER NOT NULL,
-- some other columns
)
我有一个存储过程,用于检索"用户"与他们的"当前订阅":
SELECT List-Of-Columns FROM Users LEFT OUTER JOIN Subscriptions ON
Users.CurrentSubscriptionId=Subscriptions.SubscriptionId
WHERE SomeConditionOnUsers
关键是我只需要来自"订阅的数据"对于存储过程的某些调用,而不是其他调用。所以我要在存储过程中添加一个@includeSubscriptionData
位参数(这是伪代码,我必须单独列出每个有条件的列):
SELECT List-Of-Columns-FromUsers,
CASE WHEN @includeSubscriptionData THEN Columns-From-Subscriptions ELSE NULL END
FROM Users LEFT OUTER JOIN Subscriptions ON
Users.CurrentSubscriptionId=Subscriptions.SubscriptionId
WHERE SomeConditionOnUsers
希望避免加入。所以我先尝试了这个:
DECLARE @includeSubscriptionData BIT;
SET @includeSubscriptionData=0;
SELECT List-Of-Columns-FromUsers,
CASE WHEN @includeSubscriptionData THEN SubscriptionId ELSE NULL END
FROM Users LEFT OUTER JOIN Subscriptions ON
Users.CurrentSubscriptionId=Subscriptions.SubscriptionId
WHERE SomeConditionOnUsers
该计划表明仍然可以访问"订阅"。
当该位设置为零时,如何摆脱对第二个表的访问?
答案 0 :(得分:2)
您是否尝试过将其加入加入条件?
DECLARE @includeSubscriptionData BIT;
SET @includeSubscriptionData=0;
SELECT List-Of-Columns-FromUsers,
SubscriptionId
FROM Users LEFT OUTER JOIN Subscriptions ON
Users.CurrentSubscriptionId=Subscriptions.SubscriptionId and @includeSubscriptionData = 1
WHERE SomeConditionOnUsers
OPTION(RECOMPILE)
答案 1 :(得分:1)
IF @includeSubscriptionData = 1
BEGIN
SELECT list
, of
, columns
FROM Users
INNER
JOIN Subscriptions
ON Users.CurrentSubscriptionId = Subscriptions.SubscriptionId
WHERE SomeConditionOnUsers
;
END
ELSE
BEGIN
SELECT list
, of
, columns
FROM Users
;
END
;
SELECT list
, of
, columns
FROM Users
LEFT
JOIN Subscriptions
ON Users.CurrentSubscriptionId = Subscriptions.SubscriptionId
AND @includeSubscriptionData = 1
WHERE SomeConditionOnUsers
答案 2 :(得分:0)
您可以使用IF / ELSE。
DECLARE @includeSubscriptionData BIT;
SET @includeSubscriptionData=0;
IF @includeSubscriptionData == 0
BEGIN
SELECT List-Of-Columns-FromUsers
FROM Users WHERE SomeConditionOnUsers
END
ELSE
BEGIN
SELECT List-Of-Columns-FromUsers
FROM Users LEFT OUTER JOIN Subscriptions ON Users.CurrentSubscriptionId=Subscriptions.SubscriptionId
WHERE SomeConditionOnUsers
END