Sql 具有多个属性键的左外部联接表
长期潜伏者,第一次海报 我有两张桌子“case”和“case_char” 案例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_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';
^
|