2013-10-23 108 views
1

有关如何解决此查询依赖性问题的任何想法?子查询会有帮助吗?我使用的数据库是SQL Server 2012的SQL多重左加入子查询?

FROM [Scheduling].[studentsection] AS [table027] 

Left JOIN [Grading].[StudentGradeBucket] AS [table028] 
ON ([table028].[StudentSectionID] = [table027].[StudentSectionID]) 
    And (@0 = [table002].[label]) 

Left JOIN [Grading].[GradingPeriodGradeBucket] AS [table029] 
ON [table028].[GradingPeriodGradeBucketID] = [table029].[GradingPeriodGradeBucketID] 

Left JOIN [Grading].[GradeBucket] AS [table002] 
ON [table029].[GradeBucketID] = [table002].[GradeBucketID] 

Left JOIN [Grading].[GradeBucketType] AS [table001] 
ON [table002].[GradeBucketTypeID] = [table001].[GradeBucketTypeID] 

Left JOIN [Grading].[GradeMark] AS [table022] 
ON [table028].[GradeMarkID] = [table022].[GradeMarkID] 

的依赖问题,我已经是这个:

@0 = [table002].[label] //@0 is a string variable 

像加入尚未创建,但我需要用它来创建联接的关系[评分] [StudentGradeBucket]或[table028]

+3

您需要对您的问题进行更具体的描述......您尝试解决哪些依赖性问题? (侧面说明...这是最古怪的表格别名我已经看到编码一段时间) – Twelfth

+0

我更新了我的帖子,更详细。让我知道你是否需要更多。 – user2529249

+0

什么是@ 0 - 你是指其中一个表中的一列,还是它是一个变量/参数?你使用的是哪个数据库? – JohnLBevan

回答

0

试试这个:

declare @0 nvarchar(max) = 'label value' 

select * 

from [Scheduling].[studentsection] as ss 

left join [Grading].[StudentGradeBucket] as sgb 
    on sgb.[StudentSectionID] = ss.[StudentSectionID] 

inner join [Grading].[GradingPeriodGradeBucket] as gpgb 
    on gpgb.[GradingPeriodGradeBucketID] = sgb.[GradingPeriodGradeBucketID] 

inner join [Grading].[GradeBucket] as gb 
    on gb.[GradeBucketID] = gpgb.[GradeBucketID] 
    and gb.[label] = @0 

left join [Grading].[GradeBucketType] as gbt 
    on gbt.[GradeBucketTypeID] = gb.[GradeBucketTypeID] 

left join [Grading].[GradeMark] as gm 
    on gm.[GradeMarkID] = sgb.[GradeMarkID] 

或者这一点,如果你真的想左外连接:

declare @0 nvarchar(max) = 'label value' 

select * 

from [Scheduling].[studentsection] as ss 

left join [Grading].[StudentGradeBucket] as sgb 
    on sgb.[StudentSectionID] = ss.[StudentSectionID] 

left join [Grading].[GradingPeriodGradeBucket] as gpgb 
    on gpgb.[GradingPeriodGradeBucketID] = sgb.[GradingPeriodGradeBucketID] 

left join [Grading].[GradeBucket] as gb 
    on gb.[GradeBucketID] = gpgb.[GradeBucketID] 
    and gb.[label] = @0 

left join [Grading].[GradeBucketType] as gbt 
    on gbt.[GradeBucketTypeID] = gb.[GradeBucketTypeID] 

left join [Grading].[GradeMark] as gm 
    on gm.[GradeMarkID] = sgb.[GradeMarkID] 

或者,如果您需要时,有一个匹配GradeBucket记录StudentGradeBucket只返回结果的逻辑;这样的:

declare @0 nvarchar(max) = 'label value' 

select * 

from [Scheduling].[studentsection] as ss 

left join [Grading].[StudentGradeBucket] as sgb 
    on sgb.[StudentSectionID] = ss.[StudentSectionID] 

left join [Grading].[GradingPeriodGradeBucket] as gpgb 
    on gpgb.[GradingPeriodGradeBucketID] = sgb.[GradingPeriodGradeBucketID] 

left join [Grading].[GradeBucket] as gb 
    on gb.[GradeBucketID] = gpgb.[GradeBucketID] 

left join [Grading].[GradeBucketType] as gbt 
    on gbt.[GradeBucketTypeID] = gb.[GradeBucketTypeID] 

left join [Grading].[GradeMark] as gm 
    on gm.[GradeMarkID] = sgb.[GradeMarkID] 

where 
(--filter on the gb label only if there's a result from the sgb table; 
    sgb.[StudentSectionID] is null 
    or and gb.[label] = @0 
) 
3

这是奇怪的圆形连接使用的是逻辑和你选择是使它更加混乱,这些表的别名的。别名应该简化,不要混淆。这么说,我觉得它可以只被移动到WHERE子句:

... 
Left JOIN [Grading].[GradeMark] AS [table022] ON [table028].[GradeMarkID] = [table022].[GradeMarkID] 
where @0 = [table002].[label] 

如果失败,则可能需要重新定义你的逻辑......似乎有点圆了我。

+0

这是不是会返回更多的记录,然后必要的性能也会受到打击? – user2529249

+0

使用此方法进行表格别名的原因是由于标识符的最大长度为128个字符。我们有很深的关系,当它超过128个字符时,它就无法工作。所以这是解决这个问题的方法。基本上这是通过数据层(ORM)生成的,并且在生成sql时,实际的表名称作为注释包含在顶部。 – user2529249

+0

这不是完整的查询,如果你有兴趣,我可以给你发送完整的查询。我想我们将尝试使用通用表格表达式(CTE)http://technet.microsoft.com/en-us/library/ms190766(v=sql.105).aspx – user2529249