存储过程输出具有多个内部联接的重复记录

时间:2019-09-04 22:40:11

标签: sql-server

我正在创建一个存储过程,并希望在4个不同的表之间进行内部联接。这些表是名称:

Category, SubCategory, Project, VisUser

SubCategory取决于CategoryVisUser,而Project取决于SubCategory

当我使用3个内部联接运行存储过程时,它返回正确的信息-重复了3次。

我一开始就尝试使用distinct,它确实可以正确过滤记录,但是当运行大量数据并输出3倍记录时,它可能仍然运行缓慢。

存储过程:

DROP PROCEDURE IF EXISTS GetAllProjects
GO

CREATE PROCEDURE GetAllProjects
    (@UserId INT)
AS
BEGIN 
    SELECT DISTINCT 
        proj.ProjectName, proj.ProjectDescription, sub.SubCategoryName
    FROM 
        SubCategory AS sub
    INNER JOIN 
        VisUser AS vis ON @UserId = sub.UserId
    INNER JOIN 
        Category AS cat ON cat.CategoryId = sub.CategoryId
    INNER JOIN 
        Project AS proj ON proj.SubCategoryId = sub.SubCategoryId
END

我在哪里做错了什么?我有一种感觉是因为我在内部联接中使用了“ sub” 3x。有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

INNER JOIN VisUser AS vis ON @UserId = sub.UserId

将在所有VisUsers上进行联接,因为您未在联接条件中引用该表。

由于您实际上并没有使用VisUsers表,因此请按照以下说明将其删除:

SELECT 
    DISTINCT proj.ProjectName, proj.ProjectDescription, sub.SubCategoryName
FROM SubCategory AS sub
INNER JOIN Category AS cat ON cat.CategoryId = sub.CategoryId
INNER JOIN Project AS proj ON proj.SubCategoryId = sub.SubCategoryId
WHERE sub.UserId = @UserId;

如果您确实需要VisUsers表,可以像这样加入:

SELECT 
    DISTINCT proj.ProjectName, proj.ProjectDescription, sub.SubCategoryName
FROM SubCategory AS sub
INNER JOIN VisUser AS vis ON vis.UserId = sub.UserId
INNER JOIN Category AS cat ON cat.CategoryId = sub.CategoryId
INNER JOIN Project AS proj ON proj.SubCategoryId = sub.SubCategoryId
WHERE sub.UserId = @UserId;
相关问题