Sql 具有多个属性键的左外部联接表

Sql 具有多个属性键的左外部联接表,sql,oracle,left-join,Sql,Oracle,Left Join,长期潜伏者,第一次海报 我有两张桌子“case”和“case_char” 案例 case_id | status | date 1 | closed | 01/01/2014 2 | open | 02/01/2014 大小写字符 case_id | property_key | value 1 | email | xx@xx.com 1 | phone | 1234567 2

长期潜伏者,第一次海报

我有两张桌子“case”和“case_char”

案例

case_id | status | date  
    1   | closed | 01/01/2014  
    2   | open   | 02/01/2014   
大小写字符

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表中的案例是否存在“问题”特征

下面是我编写代码的方式示例(请记住,我使用的是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'  

您应该使用显式联接,并将
属性键
放在
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\u key='issue'
之后,以防止它过滤掉空行。

我假设您希望每个案例都有一行,而不管它是否有问题,但每个案例的所有问题都有吗

如果这是您想要的,那么与此类似的东西应该会起作用(我是一个SQL Server人员,所以我不能完全确定这是否适用于Oracle)

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

这是否回答了您的问题?

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

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

谢谢你们的帮助。最后,我用SELECT c.case\u id,case c中的char.value,case\u char char,其中c.case\u id=char.case\u id(+)和char.property\u key(+)='issue'解决了这个问题。我已经回答了我自己的问题,但对于其他正在查看此查询的人来说,您的问题与我的问题相同。我很感激你抽出时间来看看它!
SELECT   C.CASE_ID, CHAR.VALUE  
FROM     CASE C, CASE_CHAR CHAR  
WHERE    
         C.CASE_ID = CHAR.CASE_ID (+)  
         AND
         CHAR.PROPERTY_KEY(+) = 'ISSUE';
                           ^
                           |