0

我一直在尝试根据表的最大列值加入这是我的表结构

表 A:

| ID | Val | text |
| 1  | 423 | tuh  |
| 2  | 369 | foo  |
| 3  | 568 | bars |
| 4  | 789 | ther |

表 B:

| Val | Label |
| 423 | Adria |
| 369 | Adria |
| 568 | Adria |
| 789 | Bang  |

表 C:

| Label | Val |
| Adria | 100 |
| Fox   | 123 |
| Bang  | 789 |

我已经尝试过这个查询,但由于某种原因,我仍然没有得到基于表 A 中的 max val 的结果

select C.Label, A.txt
from C join
     B
     on B.Label = C.Label left join
     A
     on A.Val = B.Val and
     A.Val = (select max(A.Val) from A as a where a.Val = A.val)
where C.Lable = 'Adria'

输出:

Adria tuh
Adria foo
Adria bars

预期输出:

Adria bars

有人可以帮忙指出我错过了什么吗?

4

2 回答 2

0

UPDATE用更多数据更新问题后完成重写(如果真的对我之前的漫谈感兴趣,请参阅编辑历史记录)。


假设/理解:

  • A.Val是唯一的(例如,只有一行 where A.Val = 423)否则我们将需要更多信息来连接 from Bto A(例如,如果 3x 行有A.Val = 423我们返回 3 行/A.text值,或者我们是否将匹配限制为单行通过附加标准?)
  • 如果表中没有匹配项,A则返回A.text = NULL(因此left join

我需要来自 OP 的更多输入的地方是B->A加入。从 OP 的评论中,我们知道Label = 'Adria'我们想从Awhere拉行Val = max(Val) = 568,但我不确定是否可以应用max()toB.Val或是否需要应用max()to A.Val

  • B->A加入限制为A.Val = max(B.Val) ...
  • 限制B->A加入A.Val = max(A.Val)

将加入限制为的一种想法B->AA.Val = max(B.Val)

select  CB.Label, A.text
from    (select C.Label, max(B.Val) as maxVal
         from    C
         join    B
         on      C.Label = B.Label
         and     C.Label = 'Adria'
         group by C.Label) as CB
left
join    A
on      A.Val = CB.maxVal
go

 Label      text
 ---------- ----------
 Adria      bars

如果我们delete A where Val = 568(因此A.Val = max(B.Val) = 568失败)查询返回:

 Label      text
 ---------- ----------
 Adria      NULL

将加入限制为的一种想法B->AA.Val = max(A.Val)

select  dt.Label, A.text
from    (select C.Label, max(A.Val) as maxVal
         from   C
         join   B
         on     C.Label = B.Label
         and    C.Label = 'Adria'
         left
         join   A
         on     A.Val = B.Val
         group by C.Label) as dt
left
join    A
on      A.Val = dt.maxVal
go

 Label      text
 ---------- ----------
 Adria      bars

如果我们delete A where Val = 568(这样A.Val = dt.maxVal = 423)查询返回:

 Label      text
 ---------- ----------
 Adria      tuh

如果我们delete A(因此A.Val = dt.maxVal失败)查询返回:

 Label      text
 ---------- ----------
 Adria      NULL

注意:以上查询(除非代表我的任何剪切粘贴拼写错误)是在ASE 15.7 SP140.

于 2021-09-20T14:21:08.377 回答
-1

尽管条件是多余的,但您的查询应该可以工作:

a.val = A.val

这都引用了子查询中的表。所以,它等价于1=1。实际上,它真的等价于a.val is not null

由于这种情况,我认为您在将查询转录成问题时出错了。

您可以更简单地使用TOP

select C.Label, A.txt
from C join
     B
     on B.Label = C.Label left join
     (select top (1) a.*
      from A
      order by val desc
     ) a
     on A.Val = B.Val 
where C.Label = 'Adria';
于 2021-09-20T11:13:11.147 回答