Как вычесть из двух разных таблиц в базе данных?

#c# #sql-server #tsql

Вопрос:

Когда я нажимаю кнопку, она не выдает ошибок, но в базе данных ничего не изменилось

 protected void btnBuyNow_Click(object sender, EventArgs e)
{
    using (SqlConnection con = new SqlConnection(CS))
    {
        string id = Session["UserID"].ToString();
       
        con.Open();

        SqlCommand cmd = con.CreateCommand();
        cmd.CommandType = CommandType.Text;

        cmd.CommandText = "UPDATE tblProducts SET PQuantity=t1.PQuantity-t2.Quantity FROM tblOrderProducts t2 INNER JOIN tblProducts t1 ON t2.OrderProID=t1.PID";

        cmd.ExecuteNonQuery();
       
        Response.Redirect("OrderConfirmation.aspx");
        con.Close();
    }
}
 

Запрос:

 UPDATE tblProducts
SET PQuantity = (t1.PQuantity - t2.Quantity)
FROM tblOrderProducts t2
INNER JOIN tblProducts t1 ON t2.OrderProID = t1.PID
 

Комментарии:

1. В какой момент вы создаете свой заказ (т. Е. Фактически добавляете запись в tblOrderProducts ). Я бы ожидал, что порядок исполнения будет 1. Создайте свой заказ (угадайте в tblOrders ) 2. Добавьте заказанные продукты 3. Обновите количество, используя только только что созданные записи.

2. С учетом сказанного, управление вашими количествами таким образом-это не тот подход, которым я бы подошел к этому. Если вы отслеживаете свои покупки и продажи, то ваши текущие запасы (или запасы на любую заданную дату в прошлом) могут быть рассчитаны на основе этих двух таблиц, и вам не нужно беспокоиться о сохранении столбца количества для ваших продуктов.

3. Если вы все еще находитесь на этапе разработки своей базы данных, я бы очень рекомендовал не использовать tbl префикс. Хотя это субъективно и ваш выбор, общее мнение таково, что это не добавляет ничего, кроме ненужного шума в ваш SQL — Действительно ли добавление префикса » tbl’ к именам таблиц является проблемой?

4. Начните все сначала — и обратите внимание на все предложения и замечания, сделанные по вашим предыдущим вопросам. Вы просто НЕ учитесь хорошим привычкам и НЕ думаете о своем коде. Здесь ваш код подразумевает, что пользователь работает с корзиной (или, по крайней мере, с определенным товаром). Ваш код должен сначала создать заказ на покупку, а затем вычесть соответствующую сумму из вашего инвентаря для этого продукта . Ваш код обновляет КАЖДЫЙ ПРОДУКТ из каждого заказа. Вы, по крайней мере, использовали правильный подход в своем предыдущем вопросе.

Ответ №1:

Попробуйте с:

 UPDATE t1
    SET PQuantity = (t1.PQuantity - t2.Quantity)
FROM tblProducts AS t1, tblOrderProducts AS t2
WHERE t2.OrderProID = t1.PID
 

Комментарии:

1. Использование соединений в старом стиле всеми не рекомендуется

Ответ №2:

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

 UPDATE 
 SET PQuantity = (select PQuantity FROM tblProducts Where PID =t2.OrderProID ) - t2.Quantity)
FROM tblOrderProducts t2