1

クエリは次のとおりです。

INSERT INTO @TempTable
   SELECT 
      UserID, Name,
      Address1 = 
        (SELECT TOP 1 [Address] FROM
           (SELECT TOP 1 [Address] FROM [UserAddress] ua 
            INNER JOIN UserAddressOrder uo ON ua.UserID = uo.UserID 
            WHERE ua.UserID = u.UserID
            ORDER BY uo.AddressOrder ASC) q 
          ORDER BY AddressOrder DESC),
      Address2 = 
         (SELECT TOP 1 [Address] FROM
             (SELECT TOP 2 [Address] FROM [UserAddress] ua 
              INNER JOIN UserAddressOrder uo ON ua.UserID = uo.UserID 
              WHERE ua.UserID = u.UserID
              ORDER BY uo.AddressOrder ASC) q 
           ORDER BY AddressOrder DESC)
      FROM 
         User u

このシナリオでは、ユーザーは複数のアドレス定義を持ち、優先順位を指定する整数フィールドがあります。"Address2" (2 番目の優先アドレス) は、上位 2 つの優先アドレスを取得し、それらを降順に並べ替えてから、結果から上位のアドレスを取得しようとします。Order フィールドに「2」を含むレコードに対して SELECT を実行するサブクエリを使用するだけで、Order 値が連続していないと言うかもしれません。

これをどのように書き直して、SQL 2000 の制限に準拠させることができますか?

非常に高く評価。

[編集]

句を実際のユーザー IDに置き換えu.UserIDてもWHERE、SQL Server 2000 は文句を言いません。SQL 2000 は、内部参照 (u.UserID) を外部テーブル (User u) にリンクすることを処理できないようです。

繰り返しますが、スローされるエラーは次のとおりです。

Msg 8624, Level 16, State 16, Line 24
Internal SQL Server error.
4

1 に答える 1

0

問題は行の内部参照を解決できないことが原因だったので、uo.UserID行を値をパラメーターとして INNER JOIN UserAddressOrder uo ON ua.UserID = uo.UserID受け入れる関数の呼び出しに置き換えました。uo.UserID

これは問題をエレガントに解決するわけではありませんが、仕事は完了しました (ただし、パフォーマンスはわずかに低下します)。

于 2010-05-18T16:18:40.470 に答える