2012-08-31 3 views
0

PHP로 스크립팅하고 MsSQL 데이터베이스를 사용하고 있습니다.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 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

, 나뿐만 아니라 귀하의 경우 테이블 변수에 대한 필요성을 실패합니다. 하지만 실제로 필요한 것은 우송료로 제품을 반환하는 단일 쿼리이므로 여러 개의 'getPostageCostforProduct' 요청을 실행하지 않아도됩니다. 필자는 PHP를 거의 안다. 그러나 서버 측에서 어떤 테이블이 관련되어 있는지, 구조가 무엇인지, 어떤 테이블의 열이 다른 테이블의 어느 열을 참조하는지에 대해 자세히 설명하면 SQL 쿼리를 통해 도움을 줄 수있다. 표. (아마도이 ​​특정 조각에 사용 된 두 개의 SQL 쿼리를 게시 할 수도 있습니다.) –

+0

정말 좋을 것입니다. SQL은 위에 추가되었습니다. – LeeTee

+0

나는 솔직히 조금 혼란 스럽다. 마지막 코멘트에서 짐작할 수 있듯이, 여기서는 두 가지 쿼리 만 사용되었다는 인상을 받았습니다. 두 번째 쿼리는 코드에서 호출되는 것을 실제로 볼 수는 없지만, 당연히 PHP 자체에 대한 내 가난한 지식/이해가 될 수 있습니다. 나는 대답에 대한 나의 시도를했다. 그리고 만일 그것이 완전한 쓰레기라면, 나에게 알린다. –

답변

1

당신은 자신의 우표 가격과 함께 제품을 검색 할 수 있습니다 :

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

이 우표를 얻기 위해 나는 다음과 같은 쿼리를 호출하여 데이터를 표시 할 때 외부를 사용하여 단일 쿼리 값은 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'] . '|'; 

} 
+0

네, 이것이 해결책이지만, 테이블 변수는 사용하지 않습니다. 이 문제에 대해 테이블 ​​변수를 사용하는 방법을 배우고 싶습니다. 그러나 테이블 변수를 사용하면이 시나리오에 대한 해결책이 아닐 수 있습니다. – LeeTee

+0

앞서 말했듯이,이 특별한 문제는 테이블 변수를 필요로하지 않습니다. 테이블 변수는 기본적으로 임시 변수이며 다른 변수와 마찬가지로 단지 선언 된 (다중 명령문) 쿼리에서만 볼 수 있습니다. 실제 T-SQL 임시 테이블 ('#'- 및'##'- 것들)을 사용하는 방법을 알고 있다면 쉽게 테이블 변수를 배울 것입니다. CREATE 또는 DROP하지 않고 단지 DECLARE하고 T-SQL UDF에서 사용할 수있는 유일한 임시 테이블 유형입니다. 그 외에는 별다른 차이가 없습니다. SELECT FROM, INSERT INTO, UPDATE 또는 DELETE FROM FROM WITH FROM, INSERT INTO, UPDATE 또는 DELETE FROM이 가능합니다. –

관련 문제