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的最新版本中得到适当的支持。