#sql #oracle
Вопрос:
Вот как выглядит мой стол:
col1 | col2 |
---|---|
Дата 1 | «ЭМП» |
Дата 1 | «FSA» |
Дата 1 | «ТОЛЬКО» |
ДАТА 2 | «ЭМП» |
Дата 3 | «FSA» |
Я хочу получить строки, в которых есть только «EMP», а не что-либо еще. В этом случае я должен получать только дату 2 в качестве вывода, а не дату 1.
Кто-нибудь может помочь мне с запросом?
Комментарии:
1. Похоже, никаких попыток не предпринималось
2. Попробуйте написать что-нибудь сами , а затем, если это не сработает, покажите нам конкретно, что вы сделали, чтобы мы могли вам помочь. Ты начинаешь, а потом мы помогаем. Мы пишем это не для вас. Покажите нам реальный код, который вы пробовали, а затем опишите, что произошло, а что неправильно, и тогда мы сможем вам помочь. Скорее всего, вы подойдете довольно близко к ответу, если сначала просто попробуете сами.
3. Почему только строка с датой 2? У вас есть две строки с требуемым «EMP».
Ответ №1:
Вы можете использовать подзапрос, как показано ниже:
select * from table where col1 not in (select col1 from table where col2 != 'EMP');
Ответ №2:
вот один из способов:
select * from tablename t1
where col2 = 'emp'
and not exists (select 1 from tablename t2 where t1.date = t2.date and t2.col2 <> 'emp')
или вы можете использовать оконные функции:
select * from (
select *, count(case when col2 <> 'EMP' then 1 end) over (partition by col1) cnt
from tablename
) t
where t.cnt = 0
and t.col2 = 'emp'
Комментарии:
1. первый запрос выдает мне «ошибка пропущенного левого парантеза». Это в oracle
2. Я пропустил псевдоним таблицы для col2 внутри подзапроса «t2.col2» , попробуйте сейчас
3. выберите * из таблицы CSESDEV02.BATCH_CONTROL_INFO ACTIONBATCHCONTROLINFORMATION, где ACTIONBATCHCONTROLINFORMATION.CDE_BTCH_SRCE = » EMP » и не существует (выберите 1 из таблицы CSESDEV02.BATCH_CONTROL_INFO ACTIONBATCHCONTROLINFORMATION2, где ACTIONBATCHCONTROLINFORMATION.DTE_CRTE_BC = ACTIONBATCHCONTROLINFORMATION2.DTE_CRTE_BC и ACTIONBATCHCONTROLINFORMATION2.CDE_BTCH_SRCE < > ‘EMP’)- я добавил псевдоним перед собой. это фактический запрос. это приводит к ошибке левого парантеза
4. @ushaduddu о ,удалите ключевое слово «таблица» перед именами таблиц :
select * from CSESDEV02.BATCH_CONTROL_INFO ACTIONBATCHCONTROLINFORMATION where ACTIONBATCHCONTROLINFORMATION.CDE_BTCH_SRCE = 'EMP' and not exists ( select 1 from CSESDEV02.BATCH_CONTROL_INFO ACTIONBATCHCONTROLINFORMATION2 where ACTIONBATCHCONTROLINFORMATION.DTE_CRTE_BC = ACTIONBATCHCONTROLINFORMATION2.DTE_CRTE_BC and ACTIONBATCHCONTROLINFORMATION2.CDE_BTCH_SRCE <> 'EMP' )
Ответ №3:
Вот ваш запрос. Вы добавили table
ключевое слово перед именами таблиц. В этом-то и проблема.
select * from CSESDEV02.BATCH_CONTROL_INFO ACTIONBATCHCONTROLINFORMATION
where ACTIONBATCHCONTROLINFORMATION.CDE_BTCH_SRCE = 'EMP'
and not exists (select 1 from CSESDEV02.BATCH_CONTROL_INFO ACTIONBATCHCONTROLINFORMATION2 where ACTIONBATCHCONTROLINFORMATION.DTE_CRTE_BC = ACTIONBATCHCONTROLINFORMATION2.DTE_CRTE_BC and ACTIONBATCHCONTROLINFORMATION2.CDE_BTCH_SRCE <> 'EMP')