我有两张桌子:
[Order_Header]& [Order_Item]
[Order_Header]包含字段:bus_day_id,check_no,order_hdr_id [Order_Item]包含字段:menu_item_id,tax_amt,order_hdr_id
我需要在check_no上给定menu_item_id的tax_amt
我可以使用以下命令执行单个查询:
int @a
int @b
int @c
Select menu_item_id, tax_amt_incl_sales, check_no
FROM [it_trn].[dbo].[Order_Item]
WHERE order_hdr_id = (SELECT [order_hdr_id]
FROM [it_trn].[dbo].[Order_Header]
WHERE check_no = @a
AND bus_day_id = @b)
AND menu_item_id = @c
我想做的是为@a,@ b&输入一个值表。 @c类似于以下内容:
bus_day check_no menu_item_id
1 1000 50
2 1001 51
3 1002 52
4 1003 53
4 1003 54
这将通过直接选择语句或存储过程从c#调用。
感谢您的帮助
编辑:
这可能有效,但我仍然相信有更好的方法:
Select menu_item_id, tax_amt_incl_sales, [Order_Header].check_no
FROM [it_trn].[dbo].[Order_Item]
INNER JOIN [it_trn].[dbo].[Order_Header]
ON [Order_Header].[order_hdr_id] = [Order_Item].[order_hdr_id]
WHERE [Order_Header].order_hdr_id IN
((SELECT [order_hdr_id] FROM [it_trn].[dbo].[Order_Header] where check_no = 20412 AND bus_day_id = 179),
(SELECT [order_hdr_id] FROM [it_trn].[dbo].[Order_Header] where check_no = 20410 AND bus_day_id = 179),
(SELECT [order_hdr_id] FROM [it_trn].[dbo].[Order_Header] where check_no = 20409 AND bus_day_id = 179))
答案 0 :(得分:1)
如果您的R-DBMS支持,则始终首选使用连接。 在性能方面没有任何差异,但从语义上来说,你将关系(JOINS)与过滤器(WHERE)分开。
您的第二个解决方案几乎没问题,但您不需要子查询:
WHERE
(bus_day_id = 179 AND [Order_Header].check_no = 20412) OR
(bus_day_id = 179 AND [Order_Header].check_no = 20410) OR
(bus_day_id = 179 AND [Order_Header].check_no = 20409)
您还应该在SELECT子句中为所有属性添加前缀,以防止将来发生冲突(即:将来将tax_amt_incl_sales属性添加到另一个表中)
---- UPDATE ---- WHERE CLAUSE不能使用'IN'语法
.decode()