1

嗨,我现在正在尝试加入 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 语句?谢谢你。

4

3 回答 3

0

尝试使用 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])
于 2013-04-19T10:09:26.610 回答
0

一个好的开始是在没有内联视图的情况下编写更简单的 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)
于 2013-04-19T10:04:48.450 回答
0

您可以使用 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 中的示例。

于 2013-04-19T10:05:18.813 回答