0

2 つのテーブル間に多対多の関係があります。最初のテーブルを 2 番目のテーブルとの最初の関係で並べ替え、そのテーブルから 1 つの結果のみを返したいと思います。これは SQL Server 上にあります。私はこのようなものが欲しいです:

SELECT a.retrieve_me
FROM table_A AS a
JOIN table_B AS b ON a.foo = b.foo
JOIN table_C AS c ON b.bar = c.bar
ORDER BY c.sort_me

残念ながら、MN(k) 個の結果が返されます。ここで、Mは「table_A」のカウントであり、N(k)は「table_C」との単一行kの関係の数です。DISTINCTポストフィルタリングなしで必要な結果だけを返すには、SELECT句で使用して使用しようとしましたTOP(SELECT COUNT(*) FROM table_A)が、どちらも有効な構文ではありません。

何か案は?これを可能な限りパフォーマンス化できることを願っています。

編集:

明確にするために

table A
------------
"joe" 1
"betty" 2
"george" 3

table B
------------
1 2
1 3
2 3
2 4
3 1

table C
------------
1 "ashton"
2 "harding"
3 "spring"
4 "merry lane"

「ジョージ」、「ジョー」、「ベティ」の順番で結果を返してほしい(ジョージ→アシュトン、ジョー→ハーディング、ベティ→メリーレーン)。

4

1 に答える 1

3

あなたが何を必要としているのかを正しく理解していれば、あなたに従うのは非常に難しいと思います..これでうまくいくはずです:

SELECT a.nm
FROM tablea a
cross apply (select top 1 * 
         from tableb b
         join tablec c on b.id2 = c.id
         where a.id = b.id1
         order by c.nm) bc
order by bc.nm

http://sqlfiddle.com/#!3/661c0/5/0

于 2012-09-19T15:04:31.213 に答える