0

IDの範囲を表す2つの列を含むSQLテーブルがあります。これらの範囲は、2番目のテーブルの特定のID列の下にあるセルと比較する必要があります。範囲内にある場合は、2番目のテーブルの行が戻り値に含まれます。

編集:利用可能な範囲は、ユーザーが指定した日付の範囲によって制限されます。

私はSQLの基本に精通しているだけです。ループと事前定義された表形式の関数の調査を開始する前に、誰か提案がありますか?

SELECT * FROM [ADataBase].[dbo].[AFirstTable]
  WHERE [ALongIDNumber] <=
     (SELECT [StartOfIDRange] FROM [DHL].[dbo].[ASecondTable]
     WHERE [date] BETWEEN '2010-01-21' AND '2010-01-22')
  AND   [ALongIDNumber] >=
     (SELECT [EndOfIDRange] FROM [DHL].[dbo].[ASecondTable]
      WHERE [date] BETWEEN '2010-01-21' AND '2010-01-22')

現在、これは Msg 512, Level 16, State 1, Line 2 Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. 、selectによって返される行がいくつかあるため、フラッフを引き起こしていると私が推測しているエラーを返します。

私は調査しましたが、同じような質問に出くわしましたが、その答えは固定数の範囲に対するものだけです。テーブルに範囲を照会するため、範囲の数が変わります。

このシナリオの性質上、データベースの変更は最後の手段です。

ご協力いただきありがとうございます!

4

4 に答える 4

0

これは単純な結合です。

select st.*
from SecondTable st join
     FirstTable ft
     on st.id between ft.StartOfIdRange and ft.EndOfIdRange

日付に追加の条件があるようです。あなたは質問でそれらを説明していないので、クエリにそれらを組み込む方法がわかりません。

注意深く読んだ後、日付が最初の表にあることがわかります。さて、あなたはon節または節のいずれかに範囲を追加することができますwhere

select st.*
from SecondTable st join
     FirstTable ft
     on st.id between ft.StartOfIdRange and ft.EndOfIdRange and
        ft.[date] BETWEEN '2010-01-21' AND '2010-01-22'

範囲が重複している場合は、次のようにdistinctして重複を削除することをお勧めします。

select distinct st.*
于 2012-12-27T14:39:18.067 に答える
0

とがそれぞれ最小日と最大日であると仮定すると2010-01-21、および関数を使用して、各サブクエリで単一のIDを取得できます。2010-01-22MIN()MAX()

SELECT * 
FROM [ADataBase].[dbo].[AFirstTable]
WHERE [ALongIDNumber] BETWEEN
(
    SELECT MIN(ID)
    FROM [DHL].[dbo].[ASecondTable]
)
AND
(
    SELECT MAX(ID)
    FROM [DHL].[dbo].[ASecondTable]
)
于 2012-12-27T14:40:22.507 に答える
0

oracleには範囲をチェックするためのBetweenキーワードがあります。次のようにしてください。キーワード間のサンプル

SELECT * FROM [ADataBase].[dbo].[AFirstTable]
      WHERE [ALongIDNumber] between
         (SELECT [StartOfIDRange] FROM [DHL].[dbo].[ASecondTable]
         WHERE [date] BETWEEN '2010-01-21' AND '2010-01-22')
      AND   
         (SELECT [EndOfIDRange] FROM [DHL].[dbo].[ASecondTable]
          WHERE [date] BETWEEN '2010-01-21' AND '2010-01-22')
于 2012-12-27T14:53:34.563 に答える
0

私はあなたの物語から本当にはっきりしていませんが、あなた探しているのは参加の概念だと思います:

SELECT * FROM
   [ADataBase].[dbo].[AFirstTable] first
       inner join
   [DHL].[dbo].[ASecondTable] second
       on
          first.[ALongIDNumber] between second.[StartOfIDRange] and second.[EndOfIDRange]
WHERE
   second.[date] BETWEEN '20100121' AND '20100122'

firstこれにより、の単一行として発生するID値の任意の範囲に適合する行が検索されsecondます。これは、秒単位でID値の範囲が重複している場合、の単一の元の行に対して、結果セットに複数の行を受け取る可能性があることを意味しますfirst

ループの調査を始める前に...

しないでください。SQLでループを実行するための大まかな方法​​はいくつかありますが、実際にはそこに行くべきではありません。SQLの背後にある考え方は、必要な結果を記述することです。SQLエンジンは、それを実現するための最良の方法を見つけ出します(舞台裏、ループ、ハッシュテーブルの作成、ディスクへのアイテムのスピルなど)。

于 2012-12-27T15:33:45.620 に答える