0

Microsoft Access で次のクエリを作成しました。

SELECT p.artnbr                            AS [Number], 
   p.name                              AS Name, 
   s.sizename                          AS Sizes, 
   s.sizeindex                         AS SizeIndex, 
   s.oid                               AS SizeId, 
   l.name                              AS LocationName, 
   (SELECT od.quantity 
    FROM   orderdetails od 
    WHERE  od.ORDER = (SELECT o.oid 
                       FROM   [order] o 
                       WHERE  o.active = -1 
                              AND o.location = l.oid) 
           AND od.productsize = s.oid) AS Quantity 
FROM   [size] AS s 
   INNER JOIN (product AS p 
               INNER JOIN (favorite AS f 
                           INNER JOIN location AS l 
                                   ON f.customer = l.customer) 
                       ON p.oid = f.product) 
           ON p.oid = s.product 
WHERE  f.customer = @customer 

以下のリンクは、私が使用したテーブルとそれらの関係を示しています。 https://dl.dropbox.com/u/18377860/QueryTables.png

このクエリは正しい結果を返しますが、ご覧のとおり、サブクエリを使用して数量を取得しています。その長いサブクエリの代わりに、結合ステートメントを使用してこのクエリを書き直す方法がわかりません。どんな助けでも大歓迎です。
よろしく

編集:より明確にするために、私のクエリは、[注文] があるかどうかに関係なく、(製品、サイズ、場所) のすべての一意の組み合わせを取得し、注文数量を表示する必要があります。特定の組み合わせの注文が存在しない場合、数量は null にする必要があります。

EDIT2:クエリを作成できましたが、次のようになります。

SELECT p.ArtNbr                    AS [Number], 
   p.Name                          AS Name, 
   s.SizeName                      AS Sizes, 
   s.SizeIndex                     AS SizeIndex, 
   s.Oid                           AS SizeId, 
   l.Name                          AS LocationName, 
   so.qty                          AS Quantity
FROM ([Size] AS s 
         INNER JOIN (Product AS p 
               INNER JOIN (Favorite AS f 
                           INNER JOIN Location AS l 
                                   ON f.Customer = l.Customer) ON p.OID = f.Product) 
                       ON p.OID = s.Product) 
      LEFT JOIN 
          (SELECT od.ProductSize       AS PS, 
                  od.Quantity          AS qty, 
                  o.Location as Location 
           FROM OrderDetails AS od INNER JOIN [Order] AS o ON od.Order = o.OID 
           WHERE o.Active = -1)  AS so ON so.PS = s.OID
WHERE f.Customer = @customer AND (l.OID = so.Location OR so.Location is null)

マットが言ったように、サブクエリを FROM セクションに移動し、派生テーブルの選択クエリに ProductSize と Location を含め、結果を「Size」テーブルにリンクし、最後に where セクションに条件を追加しました各ロケーションの同じレコードの繰り返しを排除します。

4

1 に答える 1

1

なんとかクエリを作成できました。次のようになります。

SELECT p.ArtNbr                    AS [Number], 
   p.Name                          AS Name, 
   s.SizeName                      AS Sizes, 
   s.SizeIndex                     AS SizeIndex, 
   s.Oid                           AS SizeId, 
   l.Name                          AS LocationName, 
   so.qty                          AS Quantity
FROM ([Size] AS s 
         INNER JOIN (Product AS p 
               INNER JOIN (Favorite AS f 
                           INNER JOIN Location AS l 
                                   ON f.Customer = l.Customer) ON p.OID = f.Product) 
                       ON p.OID = s.Product) 
      LEFT JOIN 
          (SELECT od.ProductSize       AS PS, 
                  od.Quantity          AS qty, 
                  o.Location as Location 
           FROM OrderDetails AS od INNER JOIN [Order] AS o ON od.Order = o.OID 
           WHERE o.Active = -1)  AS so ON so.PS = s.OID
WHERE f.Customer = @customer AND (l.OID = so.Location OR so.Location is null)

マットが言ったように、サブクエリを FROM セクションに移動し、派生テーブルの選択クエリに ProductSize と Location を含め、結果を「Size」テーブルにリンクし、最後に where セクションに条件を追加しました各場所の同じレコードの繰り返しを排除します。

于 2012-08-30T09:02:11.790 に答える