SQL aide: trouver les lignes d'une table qui n'existe pas en seconde table en fonction de valeurs de deux colonnes
J'ai deux tables. Je suis en train d'essayer de trouver des lignes dans une table qui n'existe pas dans le deuxième tableau basé sur les valeurs de deux colonnes. (J'ai simplifié les tableaux à deux colonnes seulement). Il n'existe pas de primaire et de clé étrangère entre les deux tables. Semble assez simple, mais je vais avoir un cerveau bloc maintenant!
DDL:
CREATE TABLE [dbo].[Table_1](
[firstname] [nchar](10) NULL,
[lastname] [nchar](10) NULL
)
CREATE TABLE [dbo].[Table_2](
[firstname] [nchar](10) NULL,
[lastname] [nchar](10) NULL
)
-- créer un échantillon de données
INSERT INTO [dbo].[Table_1]([firstname], [lastname])
SELECT N'John ', N'Doe ' UNION ALL
SELECT N'John ', N'Smith '
INSERT INTO [dbo].[Table_2]([firstname], [lastname])
SELECT N'John ', N'Doe '
--Mes tentatives ont échoué. Je m'attends à ce que John smith de retour
SELECT t.* FROM Table_1 AS t
WHERE NOT EXISTS
(SELECT t2.* FROM Table_2 AS t2
WHERE t.firstname <> t2.firstname
AND t.lastname <> t2.lastname)
SELECT * FROM Table_1 AS t
JOIN Table_2 AS t2
ON t.firstname <> t2.firstname
AND t.lastname <> t2.lastname
S'il vous plaît dire que vous n'êtes pas vraiment à l'aide de nchar types de données pour les noms. Aussi, sans aucune autre information d'identification comment voulez-vous savoir que John Smith dans le tableau 1 est le même John Smith comme dans table2? Les noms ne sont pas uniques et vous ne devriez pas l'intention de leur être. Alors que les questions ci-dessous peuvent gove vous les résultats que vous attendez, ils ne peuvent donner des résultats corrects.
C'est juste un exemple que je fouettée rapidement. oui, il doit être de type nvarchar et les personnes sont uniques, même si les noms sont les mêmes.
C'est juste un exemple que je fouettée rapidement. oui, il doit être de type nvarchar et les personnes sont uniques, même si les noms sont les mêmes.
OriginalL'auteur Tony_Henrich | 2010-01-22
Vous devez vous connecter pour publier un commentaire.
Comment à ce sujet:
Dans mon cas, je ne reçois que John Smith de retour.
En gros, vous faites une jointure externe entre les tables sur la commune de champs - les lignes qui sont présents dans les deux cas, les valeurs pour les deux
t1
ett2
.Ces lignes présentes uniquement dans
t1
n'aura pas toutes les valeurs de la deuxième tablet2
.Comment puis-je modifier cette requête pour supprimer les lignes sélectionnées?
"d'envelopper" dans un CTE
;WITH CTE AS (SELECT.....)
puis ajouter unDELETE FROM Table_1 WHERE CTE.IDColumn = .....
ou quelque chose comme ça...thx, qui fonctionne 🙂
OriginalL'auteur marc_s
Je pense que cela devrait fonctionner:
Mais je suis surpris que votre premier essai n'a pas fonctionné:
...... WHERE t.firstname = t2.firstname AND t.lastname = t2.lastname
OriginalL'auteur Matt
Vous pourriez essayer d'utiliser une jointure externe gauche à l'aide de deux colonnes dans la clause.
Puis utiliser la clause where pour filtrer quelque chose où les deux tables correspondent
OriginalL'auteur KenJ
Les jointures externes sont très bien mais je trouve cette méthode d'exécution est généralement plus rapide sur de grandes quantités de données.
OriginalL'auteur Damien