2014-10-15 4 views
1

Давайте сделаем вид, что у нас есть супермаркет. У нас есть таблица под названием Sales, где каждая запись - одна статья), поэтому, если мы сканируем 3 статьи, у нас будет 3 строки со следующими столбцами: ArticleId и Amount, где количество всегда равно 1. И тогда у нас есть таблица под названием «Статьи, columns: ArticleId и AvailableAmount.Подсчитайте столбцы в таблице, где столбцы одинаковы, а затем вычтите из столбца в другой таблице.

Когда продажа завершена, нам нужно подсчитать записи, которые являются одинаковыми в таблице Sales, а затем обновить AvailableAmount с AvailableAmount, вычитаемым с суммой каждой статьи.

Я думаю, что-то вроде этого, но я не знаю, если им правильно мыслить:

UPDATE Articles 
SET 
    AvailableAmount = AvailableAmount - (
     Select ArticleId,Count(*) From Sales Group by ArticleId HAVING Count(*) > 1 
    ) 
WHERE 
ArticleId in(Select distinct ArticleId FROM Sales) 

ответ

1

Этот запрос почти правильно, но

  1. подзапрос должен возвращать только один столбец,
  2. HAVING Count(*) > 1 не имеет смысла, и
  3. Подзапрос должен возвращать только одно значение, поэтому вам нужен correlated subquery:

    UPDATE Articles 
    SET AvailableAmount = AvailableAmount - 
         (SELECT COUNT(*) 
         FROM Sales 
         WHERE ArticleId = Articles.ArticleId) 
    WHERE ArticleId IN (SELECT ArticleId 
            FROM Sales) 
    
Смежные вопросы