2012-01-07 83 views
1

我正在爲我支持的應用程序之一編寫查詢,並且正在尋找嘗試在連接中獲取DB2版本的OR語句時花費少的代價。既然你不能在DB2 INNER JOIN OR語句

Select * 
FROM 
    TABLE A INNER JOIN TABLE B 
ON 
    A.USERNAME = B.NAME 
OR 
    A.USERNAME = B.USERNAME 

使用「或」內我一直在尋找努力UNION或UNION ALL,但我擔心的是,搭配起來可能需要更長的時間來恢復。

+1

有什麼問題你的理由?你可以在JOIN條件下使用'or'。 – 2012-01-07 16:23:11

回答

4

雖然我和其他人一起確認OR可以很容易地使用連接條件,就像在其他任何條件(因此您的查詢完全正常),在這種情況下,您仍然可以不使用OR

column = value1 OR column = value2這樣的條件,其中相同的列對多個不同的固定值進行測試,可以轉換爲column IN (value1, value2)。後者的工作不應該比前者更糟糕,最終可以看起來更清楚。

所以:

SELECT * 
FROM 
    TABLE A 
INNER JOIN 
    TABLE B 
ON 
    A.USERNAME IN (B.NAME, B.USERNAME) 
+0

這是一個不錯的選擇。 – 2012-01-07 21:52:51

+0

我再次嘗試過,是的,你可以使用「OR」語句。當我以前嘗試過時,它不斷收到錯誤信息,而且DBA說他不認爲你可以使用我們正在運行的DB2版本。感謝您的幫助。答案標記爲例外。 – em3ricasforsale 2012-01-08 03:49:02

1

您可以恢復爲使用WHERE子句語法進行連接。如果DB2優化器是聰明(我懷疑它是),它應該同樣表現不如JOIN:

SELECT * FROM TABLE1 A, TABLE2 B 
WHERE A.USERNAME = B.NAME OR A.USERNAME=B.USERNAME 
+0

我看到你在這裏遇到的問題是,你沒有在這裏定義Join,並可能允許優化器根據無效條件來鏈接表。 – em3ricasforsale 2012-01-07 16:30:38

+0

沒有必要這樣做。 'JOIN'條件允許'OR' ** **。 – 2012-01-07 16:37:38

0
SELECT GROUP_REDUCTION.TOUR, FROM_DATE, TO_DATE, DISCOUNT, GROUP_SIZE, REDUCTION 
FROM SEASON_DISCOUNT 
RIGHT JOIN GROUP_REDUCTION ON SEASON_DISCOUNT.TOUR = GROUP_REDUCTION.TOUR 
ORDER BY GROUP_REDUCTION.TOUR, FROM_DATE; 
+0

這與這個問題有什麼關係? – Ben 2014-11-04 16:35:17