Jointure Externe complète basée sur plusieurs champs

Ici est la situation dans laquelle je suis confronté:

J'ai deux tables A et B. Si les enregistrements dans la table et pas dans le tableau B, ils doivent être ajoutés à la table B. Si les enregistrements de la table B et pas dans le tableau A, ensuite, ils doivent être retirés de la table B. Le truc c'est que c'est le mélange des deux touches qui rend la combinaison unique

Table A    
Operation_Key    Part_Key  
1                1
1                2
2                1
2                3

Table B
Operation_Key    Part_Key  Record_Key
1                1         1
2                1         2
2                3         3
2                4         4

Je suis en train d'essayer d'obtenir le bon type de requête, de sorte que les résultats retournés ressembler

Results
Operation_Key        Part_Key  Record_Key   Action
1                    2         NULL         Add
2                    4         4            Delete

La requête que j'ai ressemble tellement loin de similaire à ceci:

CREATE TABLE #Action_Table
(
  Action VARCHAR(6),
  Action_Bit INT,
  Operation_Key INT,
  Record_Key INT,
  Part_Key INT
)
INSERT INTO #Action_Table
SELECT 
  CASE
    WHEN WS.Operation_Key IS NULL THEN 'Delete'
    WHEN WS.Operation_Key IS NOT NULL THEN 'Add'
  END Action,
  CASE
    WHEN WS.Operation_Key IS NULL THEN '0'
    WHEN WS.Operation_Key IS NOT NULL THEN '1'
  END Action_Bit,
  CASE
    WHEN WS.Operation_Key IS NULL THEN WC.Operation_Key
    WHEN WS.Operation_Key IS NOT NULL THEN WS.Operation_Key
  END Operation_Key,
  CASE
    WHEN WS.Operation_Key IS NULL THEN WC.Record_Key
    WHEN WS.Operation_Key IS NOT NULL THEN NULL
  END Workcenter_Component_Key,
  CASE
    WHEN WS.Operation_Key IS NULL THEN WC.Part_Key
    WHEN WS.Operation_Key IS NOT NULL THEN WS.Part_Key
  END Part_Key
FROM #WS_Part_Table WS
FULL OUTER JOIN #WC_Part_Table WC
  ON WC.Part_Key = WS.Part_Key
 AND WC.Operation_Key = WS.Operation_Key
WHERE (WS.Part_Key IS NULL or WC.Part_Key IS NULL) AND (WS.Operation_Key IS NULL or WC.Operation_Key IS NULL)

À la fois le #WS_Part_Table et de la #WC_Part_Table sont des tables temporaires que je suis de la construction à l'aide de requêtes, mais mon dilemme est que j' PRÉ-REQUÊTE la #WC_Part_Table interroger sur le fonctionnement de la clé qui m'intéresse, sinon je reçois beaucoup trop de résultats.

C'est la requête que j'utilise pour créer le #WC_Part_Table

    CREATE TABLE #WC_Part_Table
    (
      Operation_Key INT,
      Record_Key INT,
      Part_Key INT
    )
    -- Workcenter Component Table
    INSERT INTO #WC_Part_Table
    SELECT
      O.Operation_Key,
      WC.Record_Key,
      WC.Part_Key
    FROM Workcenter_Component WC
    JOIN Operation O
      ON O.Default_Workcenter_Key = WC.Workcenter_Key

 /* There is some reason why this next line is needed */
    WHERE O.Operation_Key = 23149
  • Ce SGBDR et version utilisez-vous?... en passant, avez-vous besoin d'une requête explicting votre action?, ne pouvez-vous pas simplement supprimer ou ajouter une ligne?
  • Cette requête est de générer un rapport pour avoir un homme entrer et de faire les modifications (longue histoire). Inutile de dire que je n'ai pas un accès direct à la base de données pour ajouter/insert/mettre à jour/supprimer des enregistrements, il suffit de requête et de dire à quelqu'un quoi faire.
  • Oh, c'est un peu foiré....alors vous devriez aller avec @Cybernate 's réponse
  • Vous pouvez trouver mieux si vous avez WC_Part_Table et WS_Part_Table comme VIEWS sans à l'aide de la WHERE O.Operation_Key = 23149 condition. Ensuite, vous pouvez utiliser KenTaylor ou Cybernate de vue (où vous pouvez ajouter un tel état, si vous voulez vérifier manuellement et les résultats sont trop nombreux).
InformationsquelleAutor NA Slacker | 2011-04-01