如何根据某些条件完成SQL JOIN?

时间:2015-03-04 14:43:46

标签: sql sql-server left-join

我有两张桌子:

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

该计划表明仍然可以访问"订阅"。

当该位设置为零时,如何摆脱对第二个表的访问?

3 个答案:

答案 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)

方法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
;

方法2 - 修改了连接

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