web-dev-qa-db-fra.com

PAS EN CONDITION SQL

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.....

8
user397316

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
)
17
Daniel Renshaw

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.

5
Hogan

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.

3
JosephStyons

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.

1
Bob Jarvis

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.

0
PatrickP61
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

0
JeffO