Оператор MySQL NOT IN

0

У меня есть следующие данные, которые содержат 2 разных TBL_ID - 337448 и 8612

"TBL_ID","PARAM_KEY","PARAM_VALUE"
 337448,"comment","CHANGE DUE"
 337448,"transient_lastDdlTime","1505760292"
 8612,"COLUMN_STATS_ACCURATE","true"
 8612,"numFiles","1"
 8612,"numRows","5294"
 8612,"rawDataSize","-1"
 8612,"totalSize","113217"
 8612,"transient_lastDdlTime","1452191300"

Мне нужно запросить все TBL_ID, которые не содержат "numRows". Что я пробовал:

SELECT * FROM TABLE_PARAMS 
WHERE PARAM_KEY NOT IN ('numRows')

Результаты, достижения:

"TBL_ID","PARAM_KEY","PARAM_VALUE"
 337448,"comment","CHANGE DUE"
 337448,"transient_lastDdlTime","1505760292"
 8612,"COLUMN_STATS_ACCURATE","true"
 8612,"numFiles","1"
 8612,"rawDataSize","-1"
 8612,"totalSize","113217"
 8612,"transient_lastDdlTime","1452191300"

Он удалил столбец с numRows, но мне нужно удалить весь TBL_ID (8612)

Теги:
toad
notin

2 ответа

2
Лучший ответ

Ваш вопрос немного неоднозначен. IN используется для поиска данных из набора результатов. Например, 2 IN {2, 3, 4}.

SELECT TBL_ID FROM  TABLE_PARAMS
WHERE PRAMAR_KEY='numRows'

Если вы пытаетесь не показать идентификатор, связанный с numRows, тогда вы должны получить идентификатор, который вы хотите сначала фильтровать, а пользователь НЕ РАВНО. Например, если вы пытаетесь удалить 8612 из своего набора, потому что это идентификатор Param_Key = 'numRows' И если вы пытаетесь использовать в OPERATOR, тогда

SELECT * FROM TABLE_PARAMS
WHERE TBL_ID NOT IN (SELECT TBL_ID FROM TABLE_PARAMS WHERE PARAM_KEY='numRows')       
  • 0
    Это здорово. Спасибо вам за разъяснение
2
NOT IN ('numRows')

в основном не равно

<> 'numRows'

Обычно используется NOT IN с более чем одним значением для упрощения написания целого ряда

mycol <> 'a' and mycol <> 'b' and mycol <> 'c'

и просто напишите

mycol NOT IN ('a', 'b', 'c')

или использовать подзапрос, например

mycol NOT IN (SELECT badcols FROM table)

Ваше использование похоже на случай, когда NOT EXISTS будет более полезным, чем NOT IN.

SELECT * 
FROM TABLE_PARAMS t1
WHERE NOT EXISTS (SELECT * FROM TABLE_PARAMS t2 WHERE t2.tbl_id = t1.tbl_id and t2.param_key<>'numFiles')

Или вы можете сделать то же самое с внешним соединением, как

SELECT t1.*
FROM TABLE_PARAMS t1 left outer join TABLE_PARAMS t2
  on t1.tbl_id = t2.tbl_id and t2.param_key='numFiles'
WHERE t2.tbl_id IS NULL
  • 0
    Спасибо за объяснение, отличная информация.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню