2014-02-17 2 views
0

У меня есть сценарий, похожий на следующий вопрос «join comma delimited data column». Но этот вопрос отличается от того, что мне нужно выбрать из таблицы T1.Соединяя таблицы с и без конкатенированных столбцов

Reference Fiddle

CREATE TABLE T1 ([col1] varchar(2), [col2] varchar(5)); 

INSERT INTO T1 ([col1], [col2], [col3]) 
VALUES 
    ('C1', 'john',8), 
    ('C2', 'alex',10), 
    ('C3', 'piers',10), 
    ('C4', 'sara',10); 

CREATE TABLE T2 ([col1] varchar(2), [col2] varchar(8)); 

INSERT INTO T2 ([col1], [col2] , [col3]) 
VALUES 
    ('R1', 'C1,C4',10), 
    (NULL, 'C3,C2,C5',10), 
    ('R3', 'C5,C1,C4',8); 

В конечном итоге, нужно выбрать значения из таблицы T1, и флаг, существует ли соответствующее непустое значение в таблице T2. Также необходимо рассмотреть [col3] при соединении.

Ожидаемый результат

--- Джон, да --- (Потому что 'R3' присутствует)

--- Алекс, нет ---

- - Пирс, No ---

--- Сара Да --- (Потому что 'R1' присутствует)

ВОПРОС

Каков наилучший способ написать этот запрос в Oracle 8i?

+0

Обновлены ссылки: [скрипка 1] (http://sqlfiddle.com/#!4/3c4a8/1) и [скрипка 2] (http://sqlfiddle.com/#! 4/a4216/1) – Lijo

+0

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

ответ

1

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

SELECT 
    T1.col2 
    ,CASE WHEN T2.col1 IS NULL THEN 'No' ELSE 'Yes' END 
FROM T1 
    LEFT OUTER JOIN T2 ON ',' + T2.col2 + ',' LIKE '%,' + T1.col1 + ',%' 
        AND T1.col3 = T2.col3 

Если у вас есть возможные дубликаты и вы хотите устранить их (показывая Да над Нет), то используйте:

SELECT DISTINCT 
    T1.col2 
    ,MAX(CASE WHEN T2.col1 IS NULL THEN 'No' ELSE 'Yes' END) 
FROM T1 
    LEFT OUTER JOIN T2 ON ',' + T2.col2 + ',' LIKE '%,' + T1.col1 + ',%' 
        AND T1.col3 = T2.col3 
GROUP BY 
    T1.col2 
+1

Версия Oracle - http://sqlfiddle.com/#!4/8370f/1. Использование '||' вместо '+' – Lijo

+0

См. Http://stackoverflow.com/questions/21835419/how-to-specify-optional-outer-join-condition-in-oracle-8i для Oracle 8i – Lijo

1

Этот запрос должен работать нормально (fiddle):

SELECT col2, 
     DECODE((SELECT COUNT(1) 
       FROM T2 
       WHERE T1.col3 = T2.col3 
        AND T2.col1 IS NOT NULL 
        AND T2.col2 LIKE '%' || T1.col1 || '%'), 
       0, 'NO', 'YES') 
FROM T1 

Я не очень знаком с SQL Server, но я думаю, что-то, как это должно работать там:

SELECT COL2, 
     CASE WHEN (SELECT COUNT(1) 
     FROM T2 
     WHERE T2.COL1 IS NOT NULL 
      AND T2.COL2 LIKE '%' + T1.COL1 + '%' 
      AND T1.COL3 = T2.COL3) > 0 
     THEN 'YES' 
     ELSE 'NO' END 
FROM T1 

Для того, чтобы получить более точное соответствие просто добавьте запятые и точное совпадение в разделе Сравнение строк , Например:

SELECT col2, 
     DECODE((SELECT COUNT(1) 
       FROM T2 
       WHERE T1.col3 = T2.col3 
        AND T2.col1 IS NOT NULL 
        AND (T2.col2 LIKE '%,' || T1.col1 || ',%' 
          OR T1.col1 = T2.col2)), 
       0, 'NO', 'YES') 
FROM T1 
+0

Это имеет ошибка. См. Http://sqlfiddle.com/#!4/c3473/1. Он не рассматривает 'comma' – Lijo

+0

@Lijo Да, обновил ответ, проверьте последний запрос. – Mikhail

+0

Все еще не правильно. См. Http://sqlfiddle.com/#!4/fa67d/1. 'Lijo' имеет' R2' с '97'; но отображается как NO – Lijo

Смежные вопросы