构造复杂的sql语句

时间:2012-04-17 16:03:38

标签: sql sql-server-2005

我需要选择并更新从其他表中查找值的表。我们的想法是从订单中选择一些细节,但使用id

获取外键值的名称

对于我尝试的选择:

SELECT [Order].order_date, 
       [Order].total_price, 
       [Order].order_details,
       vehicle.reg_no,
       Staff.name,
       stock.name 
FROM 
       Order,
       vehicle,
       staff,
       stock
WHERE
      order.id = @order_id 
  AND vehicle.id = Order.vehicle_id 
  AND staff.id = Order.staff_id 
  AND stock.id = Order.product_id

我尝试的更新

UPDATE order 
SET 
    total_price = @total_price, 
    order_detail = @order_detail,
    product_id = (select is from stock where name = @product_name), 
    customer_id = (select id  from customer where name = @customer_name), 
    vehicle_regno = (select reg_no  from vehicle where name = @name)
WHERE (id = @id)

两者都不会返回任何内容。我希望能够得到一些帮助,但如果没有,我会提供更多信息。

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

您正在将stock.idOrder.product_id进行比较,这可能是问题吗? 否则,为什么它不返回任何行我们需要知道表的内容,也许你需要left join而不是inner join

答案 1 :(得分:1)

您可能想尝试将INNER JOIN转换为SELECT语句的LEFT JOIN。

SELECT [Order].order_date, 
       [Order].total_price, 
       [Order].order_details,
       vehicle.reg_no,
       Staff.name,
       stock.name 
FROM 
       [Order] 
       LEFT JOIN vehicle
       ON vehicle.id = [Order].vehicle_id 
       LEFT JOIN staff
       ON staff.id = [Order].staff_id
       LEFT JOIN stock
       ON stock.id = [Order].product_id
WHERE
      [order].id = @order_id 

这会产生影响的原因是a)你是否允许fk字段中的空值或b)你没有fk约束,这可能表明你的设计有问题。

如果@id的值存在于ORDER表中,则更新语句应更新某些行,但如果@Danny Varod already commented,则不会只返回受影响行数的行