0

私はまだクエリの書き方を学んでいて、現時点ではデータベースを表示できないため、これに答えるのは少し難しいかもしれませんが、試してみます。

情報を取得しようとしているデータベースには、基本的にストア トランザクション ログとして機能する大きなテーブル (TransactionLineItems) が含まれています。このテーブルには現在、約 500 万行と、各トランザクションに含まれる製品を説明するいくつかの列 (TLI_ReceiptAlias、TLI_ScanCode、TLI_Quantity、および TLI_UnitPrice) が含まれています。このテーブルには、別のテーブル (Transactions) の主キーとペアになっている外部キーがあり、このテーブルにはトランザクション番号 (TRN_ReceiptNumber) が含まれています。これら 2 つのテーブルを結合すると、これまでに販売した商品ごとに 1 つの行が返され、各行には領収書番号が含まれます。16 行のレシート番号が同じである可能性があります。これは、これらの商品がすべて 1 回のトランザクションで販売されたことを意味します。その下にはさらに 12 行があり、それぞれが別のレシート番号を共有しています。

単一の領収書番号を共有するすべての行を返すクエリを作成しようとしていますが、その領収書番号を持つ少なくとも 1 つの行が別の列の特定の基準を満たしています。たとえば、3 つの異なる種類のギフト カードはすべて、「740000」で始まる TLI_ScanCode 列の値を持っています。TLI_ScanCode 列のこれらの 6 桁で始まる値を持つ行をクエリで返すようにしたいのですが、特定のスキャン コード基準を満たす行のいずれかとレシート番号を共有するすべての行も返したいと考えています。基本的に、すべてのレシート番号のすべての行を返すクエリが必要です。これは、少なくとも 1 つの行でギフト カード関連のスキャン コードとペアになっています。

「WHERE A.TRN_ReceiptAlias IN ( subquery ...」を使用して、レシート番号の 1 つと一致するレシート番号を持つ行のみを返すために、サブクエリを使用して、ギフト カード スキャン コードとペアになったすべてのレシート番号の列を返そうとしました。サブクエリによって返された. これは、サーバーがクエリを処理している間にさらに20分間停止する前に、5分間問題なく実行されたように見えました. クエリは正常に完了したように見えましたが、ITと協力して通常のストア操作を復元していたことを考えるとこの間、クエリの結果を取得できませんでした (関連する恥と恥ずかしさは別として)。

サーバーをハングさせずにこの情報を取得するクエリを作成する方法があるかどうかを知りたいです。私は、次のいずれかを想定しています: a) このような大きなテーブルでこのようにサブクエリを使用するのはあまり賢くなかった、または b) 必要な情報を取得するのに十分な SQL の知識がない。答えはAとBの両方だと思いますが、これを正しい方法で行う方法を学びたいと思っています. どんな助けでも大歓迎です。ありがとう!

4

2 に答える 2

0
SELECT *
  FROM a as a1
  JOIN b
    ON b.id = a.id
  JOIN a as a2
    ON a2.id = b.id
 WHERE b.some_criteria = 'something';

(b.id,b.some_criteria) にインデックスを含める

于 2013-08-06T08:43:10.127 に答える