我正在创建一个存储过程,并希望在4个不同的表之间进行内部联接。这些表是名称:
Category, SubCategory, Project, VisUser
SubCategory
取决于Category
和VisUser
,而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。有更好的方法吗?
答案 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;