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
etWS_Part_Table
commeVIEWS
sans à l'aide de laWHERE 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).
Vous devez vous connecter pour publier un commentaire.
Tyr pour obtenir les résultats que vous avez posté le:
Script De Test:
De sortie:
WS_Part_Table
ainsi? Elle pourrait être pertinente.Ajouter à B:
Supprimer à partir de B:
Vous pouvez obtenir exactement les résultats de la table que vous souhaitez (en regardant votre exemple mis en place), par l'utilisation intelligente de la SQL "FUSIONNER" de l'opérateur. Si vous utilisez une requête comme ceci:
...vous obtiendrez un résultat de la table exactement comme votre exemple.