Arhn - архитектура программирования

Запрос выбора Oracle с динамическим предложением in

У меня есть следующий запрос

    select * from table_1 
    where Conditions in 
         (select case when check_condition = 'Y' then 'Condition_1' 
                 else 'N/A' end as Check_condition 
          from table_2 
          WHERE id = 1122)

где table_1 содержит значения в столбце Conditions следующим образом. Условие_1, Условие_2

Это отлично работает и возвращает мне результаты.

я хочу использовать несколько операторов select внутри предложения in, и я сделал это, как показано ниже.

    select * from table_1
    where Conditions in (
         select ''''||
             (select case when check_condition = 'Y' then 'Condition_1' 
               else 'N/A' end as Check_condition 
               from table_2 
               WHERE id = 1122)||''''||','''||
                  (select case when check_condition = 'Y' then 'Condition_2'
                        else 'N/A' end as Check_condition 
                  from table_2 WHERE id = 1122)||''''
                 from dual
                )

внутренний запрос (внутри предложения in), дающий мне правильные результаты, как и ожидалось -

'Condition_1','Condition_2' 

и когда я копирую и вставляю его в родительский запрос, он отлично работает и показывает результаты.

select * from table_1 where Conditions in ('Condition_1','Condition_2')

Моя проблема в том, что это не дает никаких результатов, когда я использовал второй запрос. Я знаю, что подзапрос вернет результаты, которые должны соответствовать строкам внешнего запроса. Но он показывает мне пустой набор результатов.

Я использую оракул 11g

Может ли кто-нибудь помочь мне .. Спасибо всем заранее.


Ответы:


1

Вопрос немного неясен в отношении требований. Я думаю, вы хотите выбирать записи из table1 только тогда, когда:

  • строки соответствуют «Условию_1» или «Условию_2»
  • check_condition = 'Y'
  • в table2 есть строка с ID = 1122

Из вашего вопроса неясно, является ли check_condition столбцом или переменной, и если это столбец, к какой таблице он принадлежит. Следовательно, это решение может быть неправильным, но оно иллюстрирует принцип.

select * from table1 t1
where t1.conditions in ('Condition_1','Condition_2')
and t1.check_condition = 'Y'
and exists
        ( select null from table2 t2
          where t2.id = 1122 )

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

26.07.2013
  • Большое спасибо за ответ. Я понял. будет работать над этим. ценю вашу помощь. 26.07.2013

  • 2

    Вы не получите два значения, переданных в предложение in, как если бы вы делали это вручную:

    select * from table_1 where Conditions in ('Condition_1','Condition_2')
    

    Вы передаете одно значение, которое представляет собой конкатенацию значений:

    select * from table_1 where Conditions in ('''Condition_1'',''Condition_2''')
    

    И никакие condition не соответствуют этому конкатенированному значению, поэтому вы не получите никаких результатов. Вы можете сделать что-то вроде:

    select * from table_1 where Conditions in (
      select case when check_condition = 'Y' then 'Condition_1' else 'N/A' end
      from table_2 WHERE id = 1122
      union all
      select case when check_condition = 'Y' then 'Condition_2' else 'N/A' end
      from table_2 WHERE id = 1122
    )
    

    Или, возможно, если я буду следить за тем, что вы делаете (что сомнительно, поскольку я не уверен, что понимаю вашу модель данных!):

    select * from table_1 where check_condition != 'Y' or Conditions in (
      select 'Condition_1' from table_2 WHERE id = 1122
      union all
      select 'Condition_2' from table_2 WHERE id = 1122
    )
    

    Кажется, что вы должны сделать это более аккуратно, с соединениями, но я думаю, что нам нужно увидеть структуры и образцы данных, чтобы немного лучше понять, что происходит.

    26.07.2013
  • Большое спасибо за разъяснения. Я буду работать над вашим подходом. ценю вашу помощь. 26.07.2013
  • @sam - я думаю, что подход APC, вероятно, будет ближе к тому, что вам нужно (и, конечно, лучше, поскольку он коснулся table2 только один раз), но я оставлю это здесь для части объяснения. 26.07.2013
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..