Quelqu'un peut-il me dire la syntaxe exacte pour la condition NOT IN en SQL sur deux colonnes.
Ceci est ma requête écrite en VBA.
strNewSql = "SELECT distinct(tblRevRelLog_Detail.PartNumber), tblRevRelLog_Detail.ChangeLevel, tblRevRelLog_Detail.ID FROM tblRevRelLog_Detail LEFT JOIN tblEventLog ON tblRevRelLog_Detail.PartNumber = tblEventLog.PartNumber"
strNewSql = strNewSql & " WHERE (tblEventLog.PartNumber) Not In(SELECT tblEventLog.PartNumber FROM tblEventLog WHERE tblEventLog.EventTypeSelected = 'pn REMOVED From Wrapper') AND tblEventLog.TrackingNumber = """ & tempTrackingNumber & """ AND tblEventLog.TrackingNumber = tblRevRelLog_Detail.RevRelTrackingNumber;"
Je veux changer cette sous requête comme cela devrait s'appliquer à la combinaison de deux colonnes comme suit:
strNewSql = "SELECT tblRevRelLog_Detail.PartNumber, tblRevRelLog_Detail.ChangeLevel, tblRevRelLog_Detail.ID FROM tblRevRelLog_Detail LEFT JOIN tblEventLog ON tblRevRelLog_Detail.PartNumber = tblEventLog.PartNumber"
strNewSql = strNewSql & " WHERE (((tblEventLog.PartNumber, tblEventLog.PartNumberChgLvl) Not In(SELECT tblEventLog.PartNumber,tblEventLog.PartNumberChgLvl FROM tblEventLog WHERE tblEventLog.EventTypeSelected = 'pn REMOVED From Wrapper') AND tblEventLog.TrackingNumber = """ & tempTrackingNumber & """ AND tblEventLog.TrackingNumber = tblRevRelLog_Detail.RevRelTrackingNumber);"
Mais ça ne fonctionne pas.....
Vous ne pouvez pas utiliser IN
avec plusieurs colonnes, mais vous pouvez généralement obtenir le même effet avec EXISTS
:
SELECT *
FROM tbl1
WHERE NOT EXISTS
(
SELECT *
FROM tbl2
WHERE tbl2.col1 = tbl1.col1
AND tbl2.col2 = tbl1.col2
)
Syntaxe générale:
where col not in (items)
Les articles peuvent être
une liste d'éléments - (4,5,3,5,2)
ou ('243','3','cdds')
ou tout autre type de données.
Ou une instruction select (select hatefulthings from table)
Ajout 6 ans plus tard
Toutes les grandes plates-formes supportent les tuples avec NOT IN, par exemple
SELECT *
FROM empoyee
WHERE (empID, @date) NOT IN
(SELECT empID, vacationDay
FROM empVacation
)
Dans cet exemple, nous sélectionnons tous les éléments de la table employee où la tuple d'identifiant et de date d'employé ne figure pas dans une table contenant des jours de vacances.
Votre question n'est pas claire. Est-ce ce dont vous avez besoin?
SELECT *
FROM
MY_TABLE MT
WHERE 'Smith' NOT IN (MT.FIRST_NAME)
AND 'Smith' NOT IN (MT.LAST_NAME)
Cela vous montrera tous les enregistrements où la phrase de recherche ("Smith") ne se trouve ni dans la colonne prenom, ni dans la colonne prénom.
Peut-être que vous vouliez dire
SELECT *
FROM MY_TABLE
WHERE (FIRST_NAME, LAST_NAME) NOT IN (SELECT FIRST_NAME, LAST_NAME
FROM SOME_OTHER_TABLE)
Ceci est autorisé sous Oracle - pas sûr de SQL Server.
Partager et profiter.
Ce que vous demandez n’est pas clair, mais je suppose que vous aimeriez avoir une condition de non-entrée basée sur deux colonnes au lieu d’une seule.
Par exemple, supposons que vous ayez une colonne appelée F_Name et une autre appelée L_Name (les deux ayant une taille variable) et que vous souhaitiez exclure une combinaison spécifique de ces noms d'une autre table dans laquelle ils ont déjà été combinés en tant que NOM. Dans ce cas, vous pouvez faire ceci:
select F_name
, L_name
, col1
, coln
from mytable1
where F_name -- First name (variable length)
|| ' ' -- appended to a blank space
|| L_name -- appended to the last name (v)
not in -- is not one of these names
( select name
from mytable2
where ...
)
Le principal problème de cette requête est que vous devez obtenir une mise en forme parfaite pour qu'ils puissent correspondre exactement.
Si vous utilisez une combinaison de champs de types différents, tels que des chiffres et des horodatages, utilisez l'une des commandes de conversion (DECIMAL, INTEGER, CHAR, SUBSTR ...) à votre disposition pour convertir le texte en texte équivalent, puis le faire correspondre. en conséquence.
Select * from some_table
where (((Some_Value) Not IN (Select Column1 & Column2 from Some_Other_Table)));
J'ai vu où vous avez indiqué que c'était pour l'accès