2012-01-07 133 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