2014-02-17 18 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' 存在)

---亞歷克斯,無---

- - 墩,無---

---薩拉,是---(因爲 '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 for 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服務器,但我認爲,這樣的事情應該工作有:

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。它不考慮'逗號' – Lijo

+0

@Lijo是的,更新了答案,檢查最後一個查詢。 – Mikhail

+0

仍然不正確。請參閱http://sqlfiddle.com/#!4/fa67d/1。 'Lijo'有'97'的'R2';但它顯示爲NO – Lijo