使用2个配对数组作为输入时如何选择结果

时间:2017-01-05 17:04:51

标签: sql sql-server tsql

我有两张桌子:

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

1 个答案:

答案 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()