【问题标题】:Inner Join Sql Query内连接Sql查询
【发布时间】:2017-10-19 01:49:42
【问题描述】:

我有一个包含 3 个表格的问题:

1.Review(JobID)

2.Job(商号)

3.Business(BusinessNumber)(外键)。

我需要检索数据并创建具有 4 列 HighestBusinessHighestRatingLowestBusinessLowest Rating 的表。

select business.businessname AS HIGHESTRATEDBUSINESS, 
        max(review.reviewrating) as HIGHEST
from business 
    inner join job 
        on job.selectedbusinessabnnumber=business.abnnumber 
    inner join review 
        on review.jobid=job.jobid 
where review.reviewrating = (select max(reviewrating)
                             from review)  
GROUP BY businessname 
UNION 
select business.businessname AS LOWESTRATEDBUSINESS, 
     MIN(review.reviewrating) as HIGHEST
from business 
    inner join job 
        on job.selectedbusinessabnnumber=business.abnnumber 
    inner join review 
         on review.jobid=job.jobid 
where review.reviewrating = (select MIN(reviewrating)
                               from review)
GROUP BY businessname
/

我现在还没有创建表格,我只是想显示四列。

【问题讨论】:

  • 请提供一些样本和输出数据。您的查询是否返回任何行??

标签: sql oracle join union


【解决方案1】:

UNION 运算符从具有相同投影的两个集合中生成一个结果集。您需要的是四列的新投影。所以将两个子查询变成内联视图并使用 CROSS JOIN:

select h.highestratedbusiness
       , h.highest
       , l.lowestratedbusiness
       , l.lowest
from
    (select business.businessname AS HIGHESTRATEDBUSINESS, 
            max(review.reviewrating) as HIGHEST
    from business 
        inner join job 
            on job.selectedbusinessabnnumber=business.abnnumber 
        inner join review 
            on review.jobid=job.jobid 
    where review.reviewrating = (select max(reviewrating)
                                from review)  
    GROUP BY businessname ) h
cross join 
        (select business.businessname AS LOWESTRATEDBUSINESS, 
             MIN(review.reviewrating) as HIGHEST
        from business 
            inner join job 
                on job.selectedbusinessabnnumber=business.abnnumber 
            inner join review 
                 on review.jobid=job.jobid 
        where review.reviewrating = (select MIN(reviewrating)
                                       from review)
        GROUP BY businessname ) l
/

CROSS JOIN 为连接集中的每个记录组合生成一条记录。当数据产生一项最高评级的业务和一项最低评级的业务时,这将很好。但如果其中一个或两个地方存在平局,它将生成笛卡尔积。有很多方法可以解决这个问题,所以如果这对您来说是一个障碍,请完善您的问题。

【讨论】:

    猜你喜欢
    • 2016-03-29
    • 2015-06-21
    • 2013-07-06
    • 1970-01-01
    • 2011-04-15
    • 2018-03-23
    • 2013-04-26
    • 2012-12-28
    • 1970-01-01
    相关资源
    最近更新 更多