mssql - 何时/如何使用表变量

时间:2012-08-31 12:54:28

标签: php sql-server variables in-memory

我使用PHP编写脚本并使用MsSQL数据库。

我的脚本循环通过产品ID列表。对于每个id,它创建一个产品数据对象。对于产品对象中的“邮资”字段,我调用一个执行另一个查询的邮资类。

$products = $productsObj->getProducts($i, $limit);

foreach($products as $product)
{

echo $product['productName'] . '|';
echo $product['productDescription'] . '|';
echo $product['productPrice'] . '|';

$postage = $postageObj->getPostageCostforProduct(1, $product['weight'], $product['productPrice']);

echo $postage . '|';

}

有人告诉我,如果有很多产品,我可以利用'表变量'来加快这个过程。但是,我正在努力了解这有何帮助以及如何实现这一点。我会使用表变量查询替换邮资类中现有的邮资查询吗?如果是这样,究竟如何工作并帮助服务器加载?

修改

获取产品ID列表的查询是:

SELECT * FROM  FROM products WHERE category='$this->cat'

然后我循环遍历每个产品并为每个产品创建和对象。获取对象的产品数据的查询是:

SELECT  p.id as prod_id, * FROM products AS p WITH(NOLOCK)
WHERE (p.id = '$this->prod_id')

显示数据时,我调用以下查询来获取邮资:

SELECT Postage.postageName, Postage.Description AS postagedesc, Postage.id, Postage.qtyPer, Postage.pricePer, Postage.groupID, Groups.country_filter FROM  Postage 
LEFT OUTER JOIN Groups ON Postage.groupID = Groups.id 
WHERE  (Postage.minimumQty <= '$qty') AND (PostageRules.maximumQty >= '$qty') 
 (Postage.minPrice <= '$price') AND (Postage.maxPrice >= '$price') 

1 个答案:

答案 0 :(得分:1)

您可以使用外部联接Postage在单个查询中检索产品及其邮资费用值:

SELECT
  pr.productName,
  pr.productDescription,
  pr.productPrice,
  pr.productWeight,
  po.postageName,
  po.Description AS postagedesc,
  po.id,
  po.qtyPer,
  po.pricePer,
  po.groupID,
  gr.country_filter
FROM products AS pr
  LEFT JOIN Postage AS po
    ON po.minimumQty <= pr.productWeight
   AND po.maximumQty >= pr.productWeight
   AND po.minPrice   <= pr.productPrice
   AND po.maxPrice   >= pr.productPrice
  LEFT JOIN Groups  AS gr
    ON po.groupID = gr.id
WHERE pr.category = '$this->cat'

我想,这个查询可以在productsObj中以不同的名称定义(例如,作为getProductsWithPostageCosts)并使用,或许如下:

$products = $productsObj->getProductsWithPostageCosts($i, $limit);

foreach($products as $product)
{

echo $product['productName'] . '|';
echo $product['productDescription'] . '|';
echo $product['productPrice'] . '|';
echo $product['postageName'] . '|';
echo $product['postagedesc'] . '|';
...
echo $product['country_filter'] . '|';

}