НЕ в состоянии в SQL - PullRequest
       1

НЕ в состоянии в SQL

9 голосов
/ 16 ноября 2010

Может кто-нибудь сказать мне точный синтаксис условия NOT IN в SQL в двух столбцах.

Это мой запрос, написанный на 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;"

Я хочу изменить этот подзапроскак, это должно применяться к комбинации двух столбцов следующим образом:

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);"

Но это не работает .....

Ответы [ 6 ]

18 голосов
/ 16 ноября 2010

Вы не можете использовать IN с более чем одним столбцом, но обычно вы можете добиться того же эффекта, используя EXISTS:

SELECT *
FROM tbl1
WHERE NOT EXISTS
(
    SELECT *
    FROM tbl2
    WHERE tbl2.col1 = tbl1.col1
        AND tbl2.col2 = tbl1.col2
)
5 голосов
/ 16 ноября 2010

Общий синтаксис:

where col not in (items)

Элементы могут быть

  • список элементов - (4,5,3,5,2) или ('243','3','cdds') или любой другой тип данных.

  • Или выборочный оператор (select hatefulthings from table)


Добавление 6 лет спустя

Все основныеПлатформы поддерживают кортежи с NOT IN, например,

SELECT *
FROM empoyee
WHERE (empID, @date) NOT IN 
  (SELECT empID, vacationDay
   FROM empVacation
  )

. В этом примере мы выбираем все из таблицы сотрудников, где кортеж идентификатора и даты сотрудника отсутствует в таблице, содержащей дни отпуска.

3 голосов
/ 16 ноября 2010

Ваш вопрос немного неясен. Это то, что вам нужно?

SELECT *
FROM
  MY_TABLE MT
WHERE 'Smith' NOT IN (MT.FIRST_NAME)
  AND 'Smith' NOT IN (MT.LAST_NAME)

Это покажет вам все записи, в которых искомая фраза («Смит») отсутствует ни в столбце first_name, ни в фамилии.

1 голос
/ 16 ноября 2010

Возможно, вы имели в виду

SELECT *
  FROM MY_TABLE
  WHERE (FIRST_NAME, LAST_NAME) NOT IN (SELECT FIRST_NAME, LAST_NAME
                                          FROM SOME_OTHER_TABLE)

Это разрешено в Oracle - не уверен насчет SQL Server.

Делись и наслаждайся.

0 голосов
/ 16 ноября 2010

Непонятно, о чем вы спрашиваете, но я понимаю, что вы хотели бы иметь условие NOT IN, основанное на двух столбцах вместо одного.

В качестве примера предположим, что у вас есть столбец с именем F_Name и другой с именем L_Name (оба размера), и вы хотите исключить конкретную комбинацию этих имен из другой таблицы, в которой они уже объединены как NAME. В этом случае вы можете сделать это:

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

Основная проблема с этим запросом заключается в том, что вы должны правильно настроить форматирование, чтобы они точно совпали.

Если вы имеете дело с комбинацией полей разных типов, таких как числовые и временные метки, то используйте любую из имеющихся в вашем распоряжении команд преобразования (DECIMAL, INTEGER, CHAR, SUBSTR ...) для преобразования в текст, равный сопоставьте это соответственно.

0 голосов
/ 16 ноября 2010
Select * from some_table
where (((Some_Value) Not IN (Select Column1 & Column2 from Some_Other_Table)));

Я видел, где вы указали, что это было для доступа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...