在条件下从两个不同的表中获取数据

时间:2015-12-07 15:00:42

标签: sql join oracle10g

我遇到如下情况:

帖子和类似的表分别是:

       -----------------         --------------------------
      | post_id | text   |      | post_id  | like  | person|
      -------------------        ---------------------------
      |   1     |  hello |      | 1        |  yes  | Jhon  |
      |   2     |  Haii  |      | 1        |  yes  | Sham  |
      |   3     |  I am..|      | 1        |  yes  | Ram   |
      --------------------      | 2        |  yes  | Mahe  |
                                ---------------------------- 

现在我想收到所有帖子,我想知道Sham是否喜欢每个帖子。

结果将是:

           -----------------------------------
           | post_id | text  | liked_by_Sham  |
           -----------------------------------
           |   1     | hello |  yes           |
           |   2     | Haii  |  no            |
           |   3     | I am  |  no            |
           ------------------------------------

由于我是SQL新手,任何人都可以解释如何做到这一点。我尝试使用内连接,但它不起作用。

我尝试使用以下查询:

select posts.*,liketb.like 
from posts 
inner join liketb 
        on posts.post_id = liketb.post_id 
where liketb.person = 'Sham';

此查询仅提供sham喜欢的帖子。

2 个答案:

答案 0 :(得分:1)

使用left joincaselike是关键字。确保它已正确转义。

select p.post_id, p.text, 
case when l.like = 'yes' then l.like else 'no' end as liked_by_sham
from posts p
left join liketb l on p.post_id = l.post_id and l.person = 'Sham'; 

答案 1 :(得分:0)

<强> Sql Fiddle Demo

您需要将过滤器clausule置于ON部分,以便在不匹配时使用yes, nonull发布所有帖子。并使用 nvl 将所有NULL转换为'no'

SELECT p."post_id", p."text", nvl(l."like", 'no') as liked_by_sham
FROM posts p
LEFT JOIN liketb l
       ON p."post_id" = l."post_id"
      AND l."person" = 'Sham'

<强>输出

| post_id |   text | LIKED_BY_SHAM |
|---------|--------|---------------|
|       1 |  hello |           yes |
|       3 | I am.. |            no |
|       2 |   Haii |            no |