左外连接表具有多个属性键

时间:2014-06-05 03:25:39

标签: sql oracle left-join

长时间潜伏,第一次海报。

我有两个表'case'和'case_char'。

情况下

case_id | status | date  
    1   | closed | 01/01/2014  
    2   | open   | 02/01/2014   

case_char

case_id | property_key |  value  
   1    | email        | xx@xx.com  
   1    | phone        | 1234567  
   2    | email        | x2@xx.com  
   2    | phone        | 987654  
   2    | issue        | Unhappy  

假设我想为每个案例返回'问题'。并非所有情况都有问题所以我需要做一个左外连接。不幸的是,它不适用于我,它只返回具有“问题”特征的案例。我需要它来返回所有情况,无论case_char表中的case是否存在'issue'特性。

下面是我编写代码的方式示例(请记住我使用的是Oracle DB)。

你们中有谁可以帮助兄弟出去吗?

SELECT   c.case_id, char.value  
FROM  case c, case_char char  
WHERE c.case_id = char.case_id (+)  
AND char.property_key = 'issue'  

3 个答案:

答案 0 :(得分:1)

只需在您的属性键中添加一个加号(+),如下所示:

SELECT   C.CASE_ID, CHAR.VALUE  
FROM     CASE C, CASE_CHAR CHAR  
WHERE    
         C.CASE_ID = CHAR.CASE_ID (+)  
         AND
         CHAR.PROPERTY_KEY(+) = 'ISSUE';
                           ^
                           |

答案 1 :(得分:0)

您应该使用显式联接,并将property_key放在ON子句中。

SELECT c.case_id, char.value
FROM case AS c
LEFT JOIN case_char AS char ON c.case_id = char.case_id AND char.property_key = 'issue'

我不太熟悉隐式输出连接的语法。我的猜测是你需要在(+)之后放置char.property_key = 'issue'以防止它过滤掉空行。

答案 2 :(得分:0)

我假设你想要每个案例1行,不管它是否有问题,但是每个案例都有问题吗?

如果这就是你想要的东西,那么接近这个的东西应该有用(我是一个SQL Server的人,所以我并不完全确定这适用于Oracle)。

SELECT
 c.case_id
,char.value
FROM case AS c
LEFT JOIN case_char AS char
ON
    c.case_id = char.case_id
AND char.property_key = 'issue'

基本上,我们已将过滤器逻辑移至join条件,否则WHERE子句将过滤掉任何不是“问题”的内容。

这会回答你的问题吗?