长时间潜伏,第一次海报。
我有两个表'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'
答案 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
子句将过滤掉任何不是“问题”的内容。
这会回答你的问题吗?