Sql server 你能猜出这个问题吗

Sql server 你能猜出这个问题吗,sql-server,left-join,Sql Server,Left Join,好的,我有以下表格 +-------------------+ | FMdonnee | +-------------------+ | uGuid | | ... | | uGuid_FMchampForm | | uGuid_FMdoc | +-------------------+ +-------------------+ | FMchampForm | +------------------

好的,我有以下表格

+-------------------+
|      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提供的数据,它将不会采用FMCHAMP表单条目

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,但我不知道如何以FMdonnee的形式加入。我希望我能清楚地让你理解我想做什么

因为FMdonnee记录可能不存在,你需要从FMchampForm加入到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

(作为旁注,在同一个查询中混合隐式和显式联接语法是一个坏主意,因为它可能会特别混乱。)

由于FMdonnee记录可能不存在,您需要从FMchampForm到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

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

谢谢您解决了这个问题。能给我举个隐式左连接的例子吗?显式联接是通过使用关键字join来实现的?@im_a_noob:是的,显式联接是通过使用关键字join,并在联接表名称后面加上包含联接条件的ON子句来实现的-隐式联接是列出表的位置,用逗号分隔,并且在WHERE子句中有链接条件。好吧,这样就没有真正的方法来进行隐式左连接右连接了?@im\u a\u noob:您现有的查询在FMchampForm和FMdonnee之间有一个隐式的内部连接-
d.uGuid\u FMchampForm=cf.uGuid
。现代SQL方言通常不支持隐式外部联接,尽管较旧版本的SQLServer确实有一个左外部联接运算符:
*=
。我不指望它在SQLServer的最新版本中得到适当的支持。谢谢你,这个问题解决了。能给我举个隐式左连接的例子吗?显式联接是通过使用关键字join来实现的?@im_a_noob:是的,显式联接是通过使用关键字join,并在联接表名称后面加上包含联接条件的ON子句来实现的-隐式联接是列出表的位置,用逗号分隔,并且在WHERE子句中有链接条件。好吧,这样就没有真正的方法来进行隐式左连接右连接了?@im\u a\u noob:您现有的查询在FMchampForm和FMdonnee之间有一个隐式的内部连接-
d.uGuid\u FMchampForm=cf.uGuid
。现代SQL方言通常不支持隐式外部联接,尽管较旧版本的SQLServer确实有一个左外部联接运算符:
*=
。我不指望它在SQLServer的最新版本中得到适当的支持。