0

コードが更新されました: [score]列が#leftテーブルに追加されました。結合では、#leftテーブルから学生の名前スコアを取得する必要があります。1つのスコアで問題ありませんが、重複したstudent_idを取得することはできません。カーソルでできると思いますか?


このレポートを実行しています。問題は、私が作成したスクリプトに似ています。要約すると、2つのテーブルがあり、それを#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の2つのテーブルを結合したいのですが、ご覧のとおり、#leftテーブルには同じIDのJamesとParkerが2回含まれています。これがデータベースの間違いだったとしましょう。

同様の問題が#rightテーブルに存在する可能性があります。しかし、それは間違いではありません。これは単に、#leftの学生が2つの支払いに関連付けられていたことを意味します(2つの支払いが同じであっても)。

#leftテーブルから重複を削除し、#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テーブルから開始する必要があります。重複する学生行を回避するために、すでに提案されているように個別の関数を使用するか、groupbyのような集計関数を使用できます。

私のアイデアのためのいくつかのテストされていないコード:

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 に答える