2014-02-17 17 views
1

下面的代碼工作中的Oracle版本> = 9I中顯示this fiddle如何指定可選OUTER Oracle 8i中JOIN條件

SELECT T1.col1, T1.col3,count(T2.col1) 
FROM T1 
LEFT JOIN T2 
    ON T1.col3 = T2.col3 
    AND ',' || T2.col2 || ',' like '%,' || T1.col1 || ',%' 
GROUP BY T1.col1, T1.col3 

但是基於Oracle Left Outer Join文章看起來像LEFT JOINOracle 8i不可用 - 和不幸的是我在8i工作。

對於=操作我知道等效代碼

SELECT T1.col1, T1.col3 
FROM T1 
, T2 
WHERE T1.col3 = T2.col3 (+) 
--AND ',' || T2.col2 || ',' like '%,' || T1.col1 || ',%' 

問題

但我們如何可以指定OUTER JOIN條件的LIKE操作。

注意:我相信,沒有(+),它將表現爲該列的INNER JOIN。

UPDATE

下面的查詢提供了ORA-00920: invalid relational operator錯誤

SELECT T1.col1, T1.col3,count(T2.col1) 
FROM T1 
,T2 
WHERE  T1.col3 = T2.col3(+) 
    AND (',' || T2.col2 || ',') LIKE ('%,' || T1.col1 || ',%')(+) 
GROUP BY T1.col1, T1.col3 
+0

工作代碼參見[第一小提琴(HTTP結果:// sqlfiddle。 com /#!4/1ae4a/1)和[Second Fiddle](http://sqlfiddle.com/#!4/1ae4a/4)。我需要列出T1中存在的所有記錄(不管它們是否存在於T2中)。 – Lijo

+0

我認爲Oracle 8i是在1998年基於[Oracle發佈日期](http://www.dba-oracle.com/t_release_dates.htm)發佈的,它應該足以滿足我的要求。 – Lijo

+0

Working Code - http://sqlfiddle.com/#!4/1ae4a/10 – Lijo

回答

1

你可以嘗試創建一個包含修改後的列子查詢,然後連接表如下:

Select Mt1.T1_Col1, Mt1.T1_Col3,Count(Mt2.T2_Col1) 
From 
    (Select T1.Col1 As T1_Col1, T1.Col3 As T1_Col3, '%,' || T1.Col1 || ',%' As T1_Col1_New  From T1) Mt1, 
    (Select T2.Col1 As T2_Col1, T2.Col2 As T2_Col2, T2.Col3 As T2_Col3, ',' || T2.Col2 || ',' As T2_Col2_New From T2) Mt2 
Where Mt1.T1_Col3 = Mt2.T2_Col3 (+) 
And Mt1.T1_Col1_New Like Mt2.T2_Col2_New (+) 
Group By Mt1.T1_Col1, Mt1.T1_Col3; 

我結合內嵌子查詢和外連接這裏。

參考文獻:

  1. http://www.orafaq.com/wiki/Inline_view
  2. http://www.oracle-base.com/articles/9i/ansi-iso-sql-support.php
+0

看起來很有前途[小提琴](http://sqlfiddle.com/#!4/1ae4a/6)。你可以添加一些這樣的解決方案的參考(最好從堆棧溢出)? – Lijo

-1

我知道你不想聽這個,但只要任何人說,他們使用的是Oracle版本< 10克,他們必須要問的任何問題的答案都是「升級」。 2014年絕對不會有很好的理由要使用Oracle 8

+0

我認爲Oracle 8i是在1998年基於[Oracle發行日期](http://www.dba-oracle.com/t_release_dates)發佈的。 htm),它應該足以滿足我的要求。 – Lijo

+0

我認爲有一個解決方法 - http://sqlfiddle.com/#!4/1ae4a/6根據@Joseph B – Lijo

+0

雖然很容易做出這樣的一攬子聲明,但您對其特定情況一無所知。他們仍然在8i上可能有相當有用的理由。 – wadesworld

0

以下是fiddle

Select Mt1.T1_Col1, Mt1.T1_Col3,Count(Mt2.T2_Col1) 
From 
    (Select T1.Col1 As T1_Col1, 
      T1.Col3 As T1_Col3, 
      '%,' || T1.Col1 || ',%' As T1_Col1_New 
    From T1) Mt1 
, 
    (Select T2.Col1 As T2_Col1, 
      T2.Col2 As T2_Col2, 
      T2.Col3 As T2_Col3, 
      ',' || T2.Col2 || ',' As T2_Col2_New 
    From T2) Mt2 
WHERE Mt1.T1_Col3 = Mt2.T2_Col3 (+) 
And Mt2.T2_Col2_New (+) LIKE Mt1.T1_Col1_New 
--Mt2 should be on the left side of LIKE 
Group By Mt1.T1_Col1, Mt1.T1_Col3;