sql запрос oracle: хотите настроить столбец как «Да» или «Нет» на основе значений в другой таблице - PullRequest
0 голосов
/ 22 января 2020

У меня есть 2 таблицы, как показано ниже:

Таблица A

ID  ColB    ColC    ColD    ColE    
123 Test1   Team    CommentsA   Purpose1    
456 Test2   Team    CommentsB   Purpose2    
678 Test3   Team    CommentsC   Purpose3    
345 Test4   Team    CommentsD   Purpose4    

Таблица B

ID  ID1 Report
12  123 rep1
13  123 rep2
2   678 rep1
4   678 rep2 
3   345 rep1

Out Put

ID  ColB    ColC    ColD    ColE    CustomizedCol
123 Test1   Team    CommentsA   Purpose1    yes
456 Test2   Team    CommentsB   Purpose2    No
678 Test3   Team    CommentsC   Purpose3    Yes
345 Test4   Team    CommentsD   Purpose4    No

Индивидуальные Значения Col - да, если rep2 присутствует для идентификатора в Таблице 1

SQL запрос, который я пробовал, но он возвращает несколько строк для одного и того же идентификатора:

select a.ID,a.ColB,a.ColC,a.ColD,a.ColE,b.CustomizedCol
from TableA a,
     TableB b
where a.ID = B.ID1
where b.report like '%rep2%

Ответы [ 5 ]

2 голосов
/ 22 января 2020

Используйте exists:

select a.*,
       (case when exists (select 1
                          from b
                          where b.id = a.id1 and
                                b.report like '%rep2%'
                         )
              then 'Yes' else 'No'
        end) as flag
from a;

Я рекомендую exists сверх left join, потому что он элегантно обрабатывает дубликаты. Вы уверены, что получите одну строку для каждой строки в a, независимо от количества строк в b, которые могут совпадать.

Кроме того, почему вы используете like '%rep2%' вместо просто = 'rep2' ? Последний более эффективен.

2 голосов
/ 22 января 2020

вы можете использовать left join и, чтобы избежать нескольких записей, используйте distinct следующим образом:

SELECT DISTINCT
    A.*,
    CASE
        WHEN B.ID IS NOT NULL THEN 'Yes'
        ELSE 'No'
    END AS CUSTOMIZEDCOL
FROM
    TABLEA A
    LEFT JOIN TABLEB B ON A.ID1 = B.ID
                                AND B.REPORT LIKE '%rep2%;

Cheers !!

0 голосов
/ 22 января 2020

Еще один короткий способ получить желаемый результат:

select A.*,case when A.id in 
(select id1 from tableb where report like 'rep2%') 
then 'Yes' else 'No' end as CustomizedCol from TableA A
0 голосов
/ 22 января 2020

Я вижу, что в таблице A. нет столбца ID1.

Может быть, это поможет:

Select a.ID, a.ColB, a.ColC, a.ColD, a.ColE,
       NVL2(B.ID1, 'Yes', 'No') as CustomizedCol
From TableA a left outer join TableB b on a.ID = b.ID1
And b.report like '%rep2%;

Пожалуйста, измените ваш вопрос, так как он говорит a.ID1 = B.ID, что неправильно в это дело.

0 голосов
/ 22 января 2020

Попробуйте это:

select a.ID,a.ColB,a.ColC,a.ColD,a.ColE,
    NVL2(B.ID, 'Yes', 'No') as CustomizedCol
from TableA a
   left outer join TableB b on a.ID1 = B.ID AND b.report like '%rep2%;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...