簡體   English   中英

SQL多重左連接子查詢?

[英]SQL multiple left join in subquery?

有關如何解決此查詢依賴項問題的任何想法? 子查詢會有幫助嗎? 我正在使用的數據庫是sql server 2012。

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

就像尚未創建連接但我需要使用它來創建關系的連接[Grading]。[StudentGradeBucket]或[table028]

這是你正在使用的奇怪的循環連接邏輯,你選擇的這些表別名使它更加混亂。 別名應該簡化,而不是混淆。 也就是說,我認為它可以轉移到where子句:

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

如果失敗了,你可能需要重新定義你的邏輯......這對我來說似乎有點圓。

嘗試這個:

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
) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM