如果没有数据则左连接,否则为内连接

时间:2012-08-20 16:56:44

标签: sql-server join left-join inner-join

我有一个视图 V ,它从几个表中选择数据。我还有一个表 T ,用于定义允许用户查看 V 中的哪种数据类型。

对于用户,如果 T 中没有数据,则表示允许他从我的视图 V 中查看所有内容,但如果中有数据T ,然后我需要限制我的视图 V 的结果。

所以在我看来,如果 T ,则需要V Left join T,如果 T ,则需要V INNER JOIN T。{strong> T 。

但我不太清楚如何编写此查询以获得最佳性能(在服务器执行方面),提供视图 V 可能已经是一个不那么快的查询执行。我应该首先从B中选择所有内容并将其存储在某个变量或临时表中吗?或者,到目前为止我还没有听说过一个聪明的SQL语法,可以轻松完成所有事情吗?

2 个答案:

答案 0 :(得分:4)

我建议不要只关注你问题的“内连接/外连接”部分,而是建议分两步完成。

首先,您的应用程序可以查询表“T”以确定用户的访问权限。然后,其次,使用“T”中的数据来确定用户可以在“V”中访问的内容。

如果您正在编写一个控制数据库层和业务层的服务器应用程序,那么首先编写一个过程来收集所有用户的权限设置,然后执行两个查询之一 - 特权查询或非特权查询,取决于T的内容。

如果您必须在数据层中完成所有操作,请按以下步骤操作:

CREATE PROCEDURE myproc
    @current_user int
AS

-- Determine user's permission level
DECLARE @permission bit
SELECT @permission = permission FROM T WHERE t.user = @current_user

-- Use the appropriate query for this user
IF @permission IS NULL BEGIN
    SELECT * FROM V
END ELSE BEGIN
    SELECT * FROM V INNER JOIN T ON T.criteria=V.criteria
END

答案 1 :(得分:2)

如果你有一个'默认'它只能通过内部联接来完成。在T中包含所有行的用户。否则,您可以使用以下内容:

select V.*
from V,
T
where (v.id = T.Id 
AND T.User = current_user)
OR NOT EXISTS (select 1 from T where T.user=current_user)