2017-10-09 2 views
0

J'ai 3 tables (formes, champs, fieldsperform):SQL Server: requête de jointure

forms | fields | fieldsperform 
    id |  id |   formid 
group | group |  fieldid 
name | name 

Ce que je veux est d'ajouter à fieldsperform les mêmes couples formes champs, mais pour un autre groupe. Voilà ce que j'ai maintenant:

formes:

id | group | name 
0 | groupA | formA 
1 | groupA | formB 
2 | groupB | formA 
3 | groupB | formB 

Les champs

id | group | name 
0 | groupA | fieldA 
1 | groupA | fieldB 
2 | groupA | fieldC 
3 | groupB | fieldA 
4 | groupB | fieldB 
5 | groupB | fieldC 

FieldsPerForm

formid | fieldid 
    0  |  0  (formA - fieldA) 
    0  |  2  (formA - fieldC) 
    1  |  1  (formB - fieldB) 
    1  |  2  (formB - fieldC) 

Et Je veux insérer les mêmes couples mais pour le groupeB. Donc, je veux insérer:

formid | fieldid 
    2  |  3  (formA - fieldA) 
    2  |  5  (formA - fieldC) 
    3  |  4  (formB - fieldB) 
    3  |  5  (formB - fieldC) 

Logic:

Vérifiez les couples FieldsPerForm. Le premier couple est (0,0). formid = 0 est formA dans la table Forms. Dans le tableau Forms la forme Forma pour groupB a id = 2 de sorte que le formid du premier couple est 2. Puis faire la même chose pour la table Fields et ainsi de suite

+0

Votre logique pour former des paires de groupe B n'est pas claire pour moi. Pourquoi n'avons-nous pas '(2, 4)' en tant que groupe B? –

+0

La paire @TimBiegeleisen (2,4) pour le groupe B est (formA, fieldB), cette paire n'existe pas pour le groupe A. – aggicd

+0

Pourquoi n'existe-t-il pas 0,1 pour le groupe A? –

Répondre

0
INSERT INTO FieldsPerForm(formid, fieldid) 
SELECT fo.id, fi.id from 
(SELECT fo.name as foname, fi.name as finame 
    FROM FieldsPerForm fpf 
    JOIN Forms fo ON (fpf.formid = fo.id) 
    JOIN Fields fi ON (fpf.fieldid = fi.id)) datatbl 
JOIN forms fo ON (fo.name = datatbl.foname) 
JOIN fields fi ON (fi.name = datatbl.foname) 
WHERE datatbl.group = 'groupA' AND fo.group = 'groupB' 
and fi.group = 'groupB'; 
+0

Oui, les mêmes couples mais je veux les ids pour le groupeB – aggicd

0
INSERT INTO FieldsPerForm 
(
    formid 
    , fieldid 
) 

SELECT 
    FO.id 
    , FI.id 
FROM 
    Forms FO 
    JOIN Fields FI ON 
     FO.[group] = FI.[group] 
     AND 
      (
       (FO.name = 'formA' AND FI.name = 'fieldA') 
       OR (FO.name = 'formA' AND FI.name = 'fieldC') 
       OR (FO.name = 'formB' AND FI.name = 'fieldB') 
       OR (FO.name = 'formB' AND FI.name = 'fieldC') 
      ) 
WHERE FO.[group] = 'groupB' -- optional WHERE clause 
+0

Je ne cherche pas une solution avec des noms statiques. Il y a beaucoup de champs et de formulaires qui ne vont donc pas fonctionner. – aggicd

+0

"formA a 2 champs: fieldA et fieldC" - ceci n'est pas clair à partir des données. Si vous supprimez la clause WHERE ou la modifiez en <>> groupA'', le modèle actuel sera répliqué pour autant de groupes que vous avez. –

+0

C'est clair.Dans FieldsPerForm, il n'y a que deux paires pour formA: formA - fieldA et formA - fieldC – aggicd

1

Vous pouvez utiliser cette requête

DECLARE @Forms AS TABLE(id INT, [group] VARCHAR(10), name VARCHAR(10)) 
INSERT INTO @Forms 
VALUES 
('0','groupA','formA'), 
('1','groupA','formB'), 
('2','groupB','formA'), 
('3','groupB','formB') 

DECLARE @Fields AS TABLE(id INT, [group] VARCHAR(10), name VARCHAR(10)) 
INSERT INTO @Fields 
VALUES 
('0','groupA','fieldA'), 
('1','groupA','fieldB'), 
('2','groupA','fieldC'), 
('3','groupB','fieldA'), 
('4','groupB','fieldB'), 
('5','groupB','fieldC') 

DECLARE @FieldsPerForm TABLE(formid INT, fieldid INT) 
INSERT INTO @FieldsPerForm 
VALUES 
(0,0), -- (formA - fieldA) 
(0,2), -- (formA - fieldC) 
(1,1), -- (formB - fieldB) 
(1,2) -- (formB - fieldC) 

INSERT INTO @FieldsPerForm 
SELECT FRM_B.id , FLD_B.id 
FROM @Forms FRM_A 
    INNER JOIN @Fields FLD_A ON FRM_A.[group] = FLD_A.[group] 
    INNER JOIN @FieldsPerForm FF ON FF.fieldid = FLD_A.id AND FF.formid = FRM_A.id 
    INNER JOIN @Forms FRM_B ON FRM_A.name = FRM_B.name AND FRM_B.[group] = 'groupB' 
    INNER JOIN @Fields FLD_B ON FLD_A.name = FLD_B.name AND FLD_B.[group] = 'groupB' 
WHERE 
    FRM_A.[group] ='groupA' 
ORDER BY 
    FF.formid, FF.fieldid 

Résultat:

id   id 
----------- ----------- 
2   3 
2   5 
3   4 
3   5 
0

Essayez celui-ci (vous pouvez utiliser le code comme procé stocké dure, MSSQL):

DECLARE @SourceGroup varchar(max), @DestinationGroup varchar(max) 

SET @SourceGroup = 'groupA' 
SET @DestinationGroup = 'groupB' 

INSERT INTO FieldsPerForm (FormID, FieldID) 

SELECT FO1.ID as FormIDNew, 
     FI1.ID as FieldIDNew 
FROM dbo.FieldsPerForm FPF 
    JOIN 
     dbo.Forms FO ON FPF.FormID = FO.ID and FO.[Group] = @SourceGroup 
    JOIN 
     dbo.Fields FI ON FPF.FieldID = FI.ID and FI.[Group] = @SourceGroup 
    JOIN 
     dbo.Forms FO1 ON FO1.Name = FO.Name and FO1.[Group] = @DestinationGroup and FO.[Group] = @SourceGroup 
    JOIN 
     dbo.Fields FI1 ON FI1.Name = FI.Name and FI1.[Group] = @DestinationGroup and FI.[Group] = @SourceGroup