SQLServer 2008 で、理解できない奇妙な動作に遭遇しました。ユニークな顧客とユニークな支払いをすばやく組み合わせたいと思っていました。
このクエリを使用すると、期待どおりの結果が得られます。各 CustomerId は、異なる PaymentId とペアになっています。
SELECT CustomerId, PaymentId, RowNumber1, RowNumber2
FROM (
SELECT
c.Id as CustomerId,
p.Id as PaymentId,
ROW_NUMBER() OVER (PARTITION BY p.Id ORDER BY p.Id) AS RowNumber1,
ROW_NUMBER() OVER (PARTITION BY c.Id ORDER BY c.Id) AS RowNumber2
FROM Customer as c
CROSS JOIN Payment as p
) AS INNERSELECT WHERE RowNumber2 = 1
+------------+-----------+------------+------------+
| CustomerId | PaymentId | RowNumber1 | RowNumber2 |
+------------+-----------+------------+------------+
| 4 | 1 | 1 | 1 |
| 5 | 2 | 2 | 1 |
+------------+-----------+------------+------------+
ただし、外側の選択から RowNumber1 列を削除すると、結果が変わるようです。内部の select ステートメントには触れていませんが、PaymentId のすべての値が 1 になりました。
SELECT CustomerId, PaymentId, RowNumber2
FROM (
SELECT
c.Id as CustomerId,
p.Id as PaymentId,
ROW_NUMBER() OVER (PARTITION BY p.Id ORDER BY p.Id) AS RowNumber1,
ROW_NUMBER() OVER (PARTITION BY c.Id ORDER BY c.Id) AS RowNumber2
FROM Customer as c
CROSS JOIN Payment as p
) AS INNERSELECT WHERE RowNumber2 = 1
+------------+-----------+------------+
| CustomerId | PaymentId | RowNumber2 |
+------------+-----------+------------+
| 4 | 1 | 1 |
| 5 | 1 | 1 |
+------------+-----------+------------+
外部選択から列を削除すると PaymentId 列の値が変更される理由を誰かに説明してもらえますか? 結果セットの行番号を必要とせずに、目的の目標を達成するために他にどのような方法を使用できますか?