当null / not null时,使用3个表提取适当的值

时间:2016-05-05 20:53:28

标签: sql sql-server

有三个表格如下:

tbSubSubKategorie:

ID  Name    
1   PodPodKategoria_1   
2   PodPodKategoria_2   
3   PodPodKategoria_3   
4   PodPodKategoria_4   
6   PodPodKategoria_5

tbSection

Id  Name    
2   Design  
3   Wichtigste Eigenschaften der Stoffe 
4   Pflegehinweis   
5   Funktionen  
6   Sitzkomfort 
7   Abmessungen im Detail   
8   Versand & Montage   
9   Lieferumfang

tbSection_SubSubKategorie

Id  FK_Section_ID   FK_SubSubKategorie
2   2           2
5   6           2
7   2           3
8   7           3
10  5           2
11  5           3
13  8           NULL
15  3           2

在模型中,可能有一个部分可能与多个不同的子子类别相关联,或者第二个情况,当部分与任何子子类别没有关联时,则此部分将始终是一个在FK_SubSubKategorie字段中具有部分ID和空值的记录。

我现在想要获得的信息是从表tbSection_SubSubKategorie获取信息。我想获得信息:

  

tbSection_SubSubKategorie.Id,tbSectionId,tbSection.Name,   FK_SubSubKategorie.Name

当section与sububkategorie的null相关联时,我遇到了问题。

我当前的查询是这样构建的:

SELECT CASE WHEN section_subsubkategorie.FK_SubSubKategorie IS NULL THEN 'section does not contain subsubkategorie' ELSE convert(varchar(10), section_subsubkategorie.FK_SubSubKategorie, 121)  END AS IDX, *
        FROM tbSection as section
                INNER JOIN tbSection_SubSubKategorie as section_subsubkategorie ON section.Id = section_subsubkategorie.FK_Section_ID
                INNER JOIN tbSubSubKategorie as subkategorie 
                ON section_subsubkategorie.FK_SubSubKategorie = subkategorie.Id OR section_subsubkategorie.FK_SubSubKategorie IS NULL

但结果不正确:

enter image description here

正如你在第8节中看到的那样,我看到4行,应该只有一行......我甚至尝试使用CASE,但仍然不是这个。你能帮忙吗?希望你明白我的意思。

Tables creation code

2 个答案:

答案 0 :(得分:0)

如果我理解正确你得到5行而你想要1.在这种情况下,在加入tbSubSubKategorie时使用defaultConfig { applicationId "com.plante.android.cobalt" minSdkVersion 17 targetSdkVersion 18 versionCode 7 multiDexEnabled false versionName "7" } 并删除LEFT JOIN

OR

答案 1 :(得分:0)

将您的上一个INNER JOIN替换为LEFT JOIN并删除OR条款:

SELECT CASE WHEN section_subsubkategorie.FK_SubSubKategorie IS NULL THEN 'section does not contain subsubkategorie' ELSE convert(varchar(10), section_subsubkategorie.FK_SubSubKategorie, 121)  END AS IDX, *
        FROM tbSection as section
                INNER JOIN tbSection_SubSubKategorie as section_subsubkategorie ON section.Id = section_subsubkategorie.FK_Section_ID
                LEFT JOIN tbSubSubKategorie as subkategorie 
                ON section_subsubkategorie.FK_SubSubKategorie = subkategorie.Id

现在你只是在两个id匹配时才告诉它加入(因为第二个null不匹配),或者将null分别加入到每个id中,导致前6个ID中的每一个都出现重复的行。

LEFT JOIN会保留原始行,只需将null添加到FK_SubSubKategorie字段,这样也可以让您的案例陈述适用于IDX字段