0

代码更新: 在#left 表中添加了 [score] 列。连接必须从#left 表中提取学生姓名和分数。任何一个分数都可以,但不应拉取重复的 student_id。我在想光标可以做到吗?


我正在运行这份报告。问题类似于我创建的脚本。总而言之,我有两张表,我们称之为#left 和#right。#right 表是包含金额的关键表。但是#left 表包含我也必须检索的代理名称。

create table #left (
id int not null primary key identity,
student_id int, name varchar(20),score int)

insert into #left values( 1, 'James',10)
insert into #left values( 2, 'Parker',20)
insert into #left values( 3, 'Smith',30)
insert into #left values( 4, 'Rog',40)
insert into #left values( 1, 'James',50)
insert into #left values( 2, 'Parker',60)

create table #right (
id int not null primary key identity,
student_id int,
amount decimal(5,2)
)

insert into #right values (1,5.25)
insert into #right values (3,7.25)
insert into #right values (4,3.25)
insert into #right values (1,5.25)

这里的问题是我想加入 student_id 上的两个表,但是你可以看到#left 表包含 James 和 Parker 2 次具有相同的 id。让我们假设这是数据库错误。

#right 表中可能存在类似的问题。但这不是一个错误。它只是意味着#left 学生与两次付款相关联(即使两次付款相同)。

我想从 #left 表中删除 dups 并将 dups 保留在 #right 表中。

我想出了这个查询,它有效

/* query 1 */
select student_id, amount from #right R
where exists
(
select student_id from #left L
where R.student_id = L.student_id
);

但这里的问题是我还需要从另一个表中提取学生姓名。有没有办法做到这一点。它可以是任何语法,但需要高效的查询。

4

2 回答 2

3

这应该有效:

原始问题的解决方案

#left 表看起来像这样

create table #left (
id int not null primary key identity,
student_id int, name varchar(20))

insert into #left values( 1, 'James')
insert into #left values( 2, 'Parker')
insert into #left values( 3, 'Smith')
insert into #left values( 4, 'Rog')
insert into #left values( 1, 'James')
insert into #left values( 2, 'Parker')

查询:1

SELECT A.student_id, A.amount, B.name
FROM #right A
LEFT JOIN (SELECT DISTINCT student_id, name FROM #left) B
ON A.student_id = B.student_id

更新到修改后的标准好吧,如果任何分数都很好,那么你可以这样做:

查询:2

SELECT A.student_id, A.amount, B.name, B.score
FROM #right A
LEFT JOIN ( SELECT student_id, name, MIN(score) score
            FROM #left
            group by student_id, name) B
ON A.student_id = B.student_id
于 2012-06-14T21:35:29.523 回答
0

如果可以存在没有付款的学生(#right 表中没有行),您应该从我认为加入的#left 表开始。为了避免重复的学生行,您可以使用已建议的 distinct 或 group by 等聚合函数。

我的想法的一些未经测试的代码:

select name, id, amount from
  (
    (select max(left.name) as name, left.student_id as id
      from #left left
      group by left.student_id)
        left join #right right on left.student_id = right.student_id
  )
于 2012-06-14T21:56:47.977 回答