Запрос составного ключа SQL - PullRequest
2 голосов
/ 10 февраля 2009

чтобы сослаться на это снова SQL products / productsales

как я могу сделать что-то подобное, когда первичный ключ состоит из двух столбцов, а не одного?

, поэтому продукты имеют два столбца как PK, а productsales имеет два столбца как FK.

вот решение с ключом из 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 )

Ответы [ 6 ]

3 голосов
/ 10 февраля 2009

Что-то в этом роде может работать

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 
2 голосов
/ 10 февраля 2009

Похоже, что есть несколько ответов выше, которые будут работать, но просто бросить другое решение на вас, если оно работает лучше в вашем случае:

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
     )

Этот метод будет работать хуже, чем INNER JOIN, с методом GROUP BY, данным мистером Браунстоуном, но в некоторых ситуациях, в зависимости от значения @cutoff_quantity и размеров таблицы, он может работать лучше.

2 голосов
/ 10 февраля 2009

Может быть, что-то подобное сделает:

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 )
1 голос
/ 10 февраля 2009

Мне нравится делать это так:

;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 
1 голос
/ 10 февраля 2009

Попробуйте:

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 )
0 голосов
/ 10 февраля 2009

Рефакторинг с одним ключом

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 )

То же на двух клавишах:

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 )
...