繁体   English   中英

SQL:内部连接与前2行中的前2行一起使用

[英]SQL: Inner join with top 2 rows with second table from on condition

嗨,我现在正试图从第二个表联接到第一个表的仅2行联接2个表。

例如,我有以下2个表:

**Table A**
Column1 |   Column2 |   Column3
A       |   B       |   30
A       |   C       |   50
A       |   D       |   25

**Table B**
Column4 |   Column5
B       |   35  
B       |   90
B       |   65
B       |   80
B       |   85
B       |   40
C       |   100
C       |   60
C       |   70
C       |   65

这是我的普通查询的示例:

select *
from 
    (
        select * 
        from A 
        where Column1 = 'A' and (Column2 = 'B' or Column2 = 'C') 
        order by Column2, Column3
    ) A
    inner join
    (
        select * 
        from B 
        where (Column4 = 'B' or Column4 = 'C') 
        order by Column5
    ) B
    on (A.Column2 = B.Column4 and ((B.Column5 - A.Column3) > 30))

结果应如下所示:

**Result:**
Column1   |   Column2 |   Column3 |   Column4 |   Column5 
A         |   B       |   30      |   B       |   65
A         |   B       |   30      |   B       |   80 
A         |   B       |   30      |   B       |   85 
A         |   B       |   30      |   B       |   90
A         |   C       |   50      |   C       |   100

但是,我想要的结果是仅从第二个表结果联接2行。 预期结果应为:

**Expected Result:**
Column1   |   Column2 |   Column3 |   Column4 |   Column5
A         |   B       |   30      |   B       |   65
A         |   B       |   30      |   B       |   80
A         |   C       |   50      |   C       |   100

有谁知道如何创建这样的sql语句? 谢谢。

一个好的开始是编写没有内联视图的更简单的SQL:

select *
from   A inner join
       B on (A.Column2 = B.Column4)    
where  A.Column1 = 'A'               and
       A.Column2 in ('B','C')        and
       (B.Column5 - A.Column3) > 30)

您可以使用row_number()限制行数。 该示例假定(Column1, Column2, Column3)是唯一的。 如果表A具有主键,请改用它。

select  *
from    (
        select  Column1
        ,       Column2
        ,       Column3
        ,       Column4
        ,       Column5
        ,       row_number() over (partition by Column1, Column2, Column3 
                                   order by Column5 - Column3 desc) as rn
        from    A
        join    B
        on      A.Column2 = B.Column4
        where   Column1 = 'A' 
                and Column2 in ('B', 'C')
                and Column5 - Column3 > 30
        ) SubQueryAlias
where   rn < 2

请参见SQL Fiddle中的示例。

尝试使用CTE

WITH Top2Rows AS (
    SELECT TOP 2 *
    FROM TableB
    WHERE ([ADD CONSTRAINTS])
)

SELECT *
FROM TableA a
JOIN Top2Rows r ON a.ID = b.ID
WHERE ([ADD CONSTRAINTS])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM