2013-04-26 71 views
1

OK,我有以下表能弄清楚這個查詢

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

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

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

uGuid是所有表的主鍵,它的類型是唯一標識符

FMchampForm總是支持有數據,但它的外鍵uGuid_FMgroup可能空值。 FMdonnee表中可能有一些數據。我試圖從FMchampForm中獲取與FMchamp(FMchampform的fk)匹配的所有數據,並且如果FMdonnee或FMgroup中的數據附加到FMchampForm的這個條目中,我希望將它們提取出來。

我試了下面。女巫是差不多好了,除了它不會採取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 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 

我想我需要的LEFT JOIN的FMdonnee,但我不知道如何加入它也FMchampForm 。我希望我明白足以讓你瞭解我想要做什麼

回答

1

由於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 

(作爲一個方面說明,這是一個壞主意,混合在同一個查詢隱性和顯性連接語法,因爲它可以是特別混亂。)

+0

謝謝你這個工作了。可以給我一個隱式的左連接的例子嗎?顯式連接是通過使用關鍵字JOIN? – 2013-04-26 12:04:43

+0

@im_a_noob:是的,顯式連接是通過使用關鍵字JOIN,並使用包含連接條件的ON子句在連接的表名後進行的 - 隱式連接是列出表的位置,以逗號分隔,並且鏈接條件爲WHERE子句。 – 2013-04-26 12:11:57

+0

所有權利,所以沒有真正的方法來做一個隱式的左加入吧? – 2013-04-26 12:13:29