1

好的,我有以下表格

+-------------------+
|      FMdonnee     |
+-------------------+
| uGuid             |
| ...               |
| uGuid_FMchampForm |
| uGuid_FMdoc       |
+-------------------+

+-------------------+
|   FMchampForm     |
+-------------------+
| uGuid             |
| ...               |
| uGuid_FMgroup     |
| uGuid_FMsection   |
+-------------------+

+-------------------+
|      FMgroup      |
+-------------------+
| uGuid             |
| ...               |
+-------------------+

uGuid 是所有表的主键,它的类型是 uniqueidentifier

FMchampForm 总是有数据,但它的外键 uGuid_FMgroup 可能为空。表 FMdonnee 中可能有一些数据。我正在尝试从 FMchampForm 中获取与相应 FMsection(FMchampform 的 fk)匹配的所有数据,如果 FMdonnee 或 FMgroup 中有数据附加到 FMchampForm 的此条目,我想获取它们。

我尝试了以下。Witch 几乎很好,只是如果没有来自 FMdonnee 的数据,它不会使用 FMchampForm 条目

SELECT  cf.cNom                     nom_cf
          , cf.iPosition                pos_cf
          , cf.cTypeValeur              typVal_cf
          , cf.bActif                   actif_cf
          , cf.cCommentaire             com_cf
          , cf.bLabelVisible            lblVisible_cf
          , cf.cPadding                 pad_cf
          , cf.bMultiLines              multiLines_cf
          , cf.bStartLine               startLine_cf
          , g.cNom                      nom_g
          , g.iPosition                 pos_g
          , g.iNbRepTemplate            nbRepTemplate_g
          , g.cCommentaire              com_g
          , g.cPadding                  pad_g
          , g.bLabelVisible             lblVisible_g
          , g.bIsBreakable              isBreakable_g
          , d.cValeur                   valeur_d
          , d.cGroupe                   groupe_d
          , d.uGuid_FMunite             guidUnite_d
FROM FMdonnee d, FMchampForm cf
LEFT JOIN FMgroup g ON cf.uGuid_FMgroup = g.uGuid
WHERE cf.uGuid_FMsection = @guidFMsection
AND d.uGuid_FMchampForm = cf.uGuid
AND d.uGuid_FMdoc = @guidFMdoc
ORDER BY g.iPosition ASC, d.cGroupe ASC, cf.iPosition ASC, cf.cNom ASC

我想我需要左加入 FMdonnee,但我不知道如何在 FMchampForm 上加入它。我希望我能清楚地让你理解我想要做什么

4

1 回答 1

1

由于 FMdonnee 记录可能不存在,您需要从 FMchampForm LEFT JOIN 到 FMdonnee。尝试:

SELECT  cf.cNom                     nom_cf
          , cf.iPosition                pos_cf
          , cf.cTypeValeur              typVal_cf
          , cf.bActif                   actif_cf
          , cf.cCommentaire             com_cf
          , cf.bLabelVisible            lblVisible_cf
          , cf.cPadding                 pad_cf
          , cf.bMultiLines              multiLines_cf
          , cf.bStartLine               startLine_cf
          , g.cNom                      nom_g
          , g.iPosition                 pos_g
          , g.iNbRepTemplate            nbRepTemplate_g
          , g.cCommentaire              com_g
          , g.cPadding                  pad_g
          , g.bLabelVisible             lblVisible_g
          , g.bIsBreakable              isBreakable_g
          , d.cValeur                   valeur_d
          , d.cGroupe                   groupe_d
          , d.uGuid_FMunite             guidUnite_d
FROM FMchampForm cf
LEFT JOIN FMdonnee d 
       ON d.uGuid_FMchampForm = cf.uGuid AND d.uGuid_FMdoc = @guidFMdoc
LEFT JOIN FMgroup g ON cf.uGuid_FMgroup = g.uGuid
WHERE cf.uGuid_FMsection = @guidFMsection
ORDER BY g.iPosition ASC, d.cGroupe ASC, cf.iPosition ASC, cf.cNom ASC

(附带说明一下,在同一个查询中混合隐式和显式连接语法是一个坏主意,因为它可能特别令人困惑。)

于 2013-04-26T11:56:05.600 回答