2

これを再度参照するにはSQL products/productsales

主キーが 1 列ではなく 2 列で構成されている場合、どのようにすればよいでしょうか?

したがって、products には PK として 2 つの列があり、productsales には FK として 2 つの列があります。

1列のキーを使用したソリューションは次のとおりです。

SELECT p.[name]
FROM products p
WHERE p.product_id in (SELECT s.product_id
    FROM productsales s
    WHERE s.[date] between @dateStart and @dateEnd
    GROUP BY s.product_id
    HAVING Sum(s.quantity) > @X )
4

6 に答える 6

3

これらの線に沿った何かが機能する可能性があります

SELECT p.[name]
FROM products p
JOIN (SELECT s.key1, s.key2
    FROM productsales s
    WHERE s.[date] between @dateStart and @dateEnd
    GROUP BY s.product_id
    HAVING Sum(s.quantity) > @X ) as a on a.key1 = p.key1 and a.key2 = p.key2 
于 2009-02-10T11:54:40.607 に答える
2

上記のいくつかの答えがうまくいくように見えますが、あなたのケースでうまくいく場合に備えて、別の解決策を投げてください:

SELECT
     P.name
FROM
     Products P
WHERE
     EXISTS
     (
          SELECT
               *
          FROM
               ProductSales PS
          WHERE
               PS.product_id = P.product_id AND
               PS.date BETWEEN @date_start AND @date_end
          GROUP BY
               PS.product_id
          HAVING
               SUM(PS.quantity) > @cutoff_quantity
     )

このメソッドは、Brownstone 氏によって提供された GROUP BY メソッドを使用した INNER JOIN よりもパフォーマンスが低下する傾向がありますが、@cutoff_quantity の値とテーブル サイズによっては、パフォーマンスが向上する場合があります。

于 2009-02-10T15:17:23.503 に答える
2

たぶん、次のようなことができます:

SELECT p.first_col_id,p.second_col_id 
FROM products p
JOIN productsales s
   ON s.first_col_id = p.first_col_id 
  AND s.second_col_id = p.second_col_id 
  AND s.[date] between @dateStart and @dateEnd
GROUP BY p.first_col_id,p.second_col_id 
HAVING Sum(s.quantity) > @X )
于 2009-02-10T11:58:03.920 に答える
1

試す:

SELECT p.[name]
FROM products p
WHERE (p.product_key1, p.product_key2) in
   (SELECT s.product_key1, s.product_key2
    FROM productsales s
    WHERE s.[date] between @dateStart and @dateEnd
    GROUP BY s.product_key1, s.product_key2
    HAVING Sum(s.quantity) > @X )
于 2009-02-10T12:01:42.257 に答える
1

私はこのようにするのが好きです:

;WITH t 
     AS (SELECT s.product_id 
         FROM   productsales s 
         WHERE  s.[date] BETWEEN @dateStart AND @dateEnd 
         GROUP  BY s.product_id 
         HAVING Sum(s.quantity) > @X) 
SELECT p.[name] 
FROM   products p 
       JOIN t 
         ON p.pk1 = t.fk1 
            AND p.pk2 = t.fk2 
于 2009-02-10T12:05:26.680 に答える
0

1つのキーでリファクタリング

SELECT s.product_id, p.[name]
FROM products p JOIN productsales s ON p.product_id=s.product_id
WHERE s.[date] between @dateStart and @dateEnd
GROUP BY s.product_id, p.[name]
HAVING Sum(s.quantity) > @X )

2 つのキーで同じ:

SELECT s.k1, s.k2, p.[name]
FROM products p JOIN productsales s ON (p.k1=s.k1 AND p.k2=s. k2)
WHERE s.[date] between @dateStart and @dateEnd
GROUP BY s.k1, s.k2, p.[name]
HAVING Sum(s.quantity) > @X )
于 2009-02-10T12:02:29.243 に答える