0

各サプライヤーの上位 5 つの製品を選択するサブクエリを実行しています。選択は、各サプライヤーの製品に対してランダムに行う必要があります。

このために、次のクエリを作成しました (Allen Browne の例に基づいています)。

SELECT tblProducts_temp.SupplierID, tblProducts_temp.GTIN
FROM tblProducts_temp
GROUP BY tblProducts_temp.SupplierID, tblProducts_temp.GTIN
HAVING (((tblProducts_temp.GTIN) In (SELECT TOP 5 Dupe.GTIN 
FROM tblProducts_temp AS Dupe 
WHERE Dupe.SupplierID = tblProducts_temp.SupplierID 
ORDER BY RND(Dupe.GTIN) DESC)))
ORDER BY tblProducts_temp.SupplierID, tblProducts_temp.GTIN;

クエリはランダムな数の製品を返しますが、トップ 5 ではありません。つまり、サプライヤ X の場合、一度は 3 つの製品であり、次回はサプライヤ X の場合は 7 つの製品です。

RND 関数を使用しないクエリなので、上位 5 つだけが正常に機能します。

SELECT tblProducts_temp.SupplierID, tblProducts_temp.GTIN
FROM tblProducts_temp
GROUP BY tblProducts_temp.SupplierID, tblProducts_temp.GTIN
HAVING (((tblProducts_temp.GTIN) In (SELECT TOP 5 Dupe.GTIN 
FROM tblProducts_temp AS Dupe 
WHERE Dupe.SupplierID = tblProducts_temp.SupplierID 
ORDER BY Dupe.GTIN DESC)))
ORDER BY tblProducts_temp.SupplierID, tblProducts_temp.GTIN;

私は本当に立ち往生しています。誰でも私を助けてください!

どうも!

4

1 に答える 1

0

が同じクエリで をRnd()台無しにしているように見える場合は、おそらく次のように、 を独自のサブクエリに移動してみてください (未テスト)?TOP 5Rnd()

SELECT 
    tblProducts_temp.SupplierID, 
    tblProducts_temp.GTIN
FROM tblProducts_temp
GROUP BY 
    tblProducts_temp.SupplierID, 
    tblProducts_temp.GTIN
HAVING 
    tblProducts_temp.GTIN IN 
        (
            SELECT TOP 5 Dupe.GTIN 
            FROM 
                (
                    SELECT GTIN, Rnd(GTIN) AS rndSeq
                    FROM tblProducts_temp AS t3
                    WHERE t3.SupplierID = tblProducts_temp.SupplierID
                ) AS Dupe 
            ORDER BY Dupe.rndSeq DESC
        )
ORDER BY 
    tblProducts_temp.SupplierID, 
    tblProducts_temp.GTIN;

編集

上記のクエリのテーマでいくつかの異なるバリエーションを試してみましたが、Rnd()そのようなサブクエリで動的関数を使用すると、データベース エンジンが実際に混乱するようです。Rnd()サブクエリが繰り返し呼び出されるたびに値が変化するため、レコードの「ソート順」が流動的であると思われます。

この問題の解決策は、[tblProducts_temp] テーブルをAutoNumber(Random)プライマリ キー フィールド (以下の例では [rndID] という名前) で作成することです。そのため、[SupplierID] と [GTIN] の値が次のような方法で INSERT されると...

INSERT INTO tblProducts_temp ( SupplierID, GTIN )
SELECT tblProducts.SupplierID, tblProducts.GTIN
FROM tblProducts;

...次に、[tblProducts_temp] の各行には、永続的なランダムなキー値があります (少なくとも手元のタスクの期間中は変更されません)。

rndID        SupplierID  GTIN
-----------  ----------  ----
-1615446985           1     1
  132251564           1     2
  -43091651           1     3
-1416094278           1     4
  552752563           1     5
-1319640456           1     6
 1743429401           1     7
  409890150           2     1
 1563614959           2     2
 1727785476           2     3
 -611861835           2     4
 1826254802           2     5
-1118022677           2     6
 -530587056           2     7

ORDER BY RND(Dupe.GTIN)それが整ったら、質問の元のクエリを次のように置き換えるだけで機能させることができますORDER BY Dupe.rndID

SELECT 
    tblProducts_temp.SupplierID, 
    tblProducts_temp.GTIN
FROM tblProducts_temp
GROUP BY 
    tblProducts_temp.SupplierID, 
    tblProducts_temp.GTIN
HAVING tblProducts_temp.GTIN In 
    (
        SELECT TOP 5 Dupe.GTIN 
        FROM tblProducts_temp AS Dupe 
        WHERE Dupe.SupplierID = tblProducts_temp.SupplierID 
        ORDER BY Dupe.rndID DESC
    )
ORDER BY 
    tblProducts_temp.SupplierID, 
    tblProducts_temp.GTIN;
于 2013-06-02T12:52:21.930 に答える