2017-02-21 2 views
0

기준에 따라 다른 테이블과 일치하는 레코드가있는 테이블의 ID 필드를 업데이트하는 스크립트가 있습니다.업데이트시 정렬 순서 정의

아래는 일반적인 쿼리 구조입니다.

update p.saleId = e.saleId 
from products p inner join sales s on s.crit1 = p.crit1 
where p.someDate between s.startDate and s.endDate 

괜찮습니다. 내 문제는 일부 상황에서 일반적으로 괜찮은이 쿼리를 사용하여 '판매'테이블에 둘 이상의 일치가 있다는 것입니다. 그러나 나는 다른 분야를 기반으로 이러한 결과를 정렬하여 가장 높은 비용을 가진 saleId를 얻을 수 있는지 확인하고자합니다.

그럴 수 있습니까?

+0

샘플 데이터를 보낼 수 있습니까? 및 출력 예. –

+0

위의 업데이트 구문이 올바른지 ......... ?? 나는'SET'이 누락되어 있으며 하위 쿼리를 사용하여 원하는 것을 얻을 수 있다고 생각한다. 그리고 또 하나의'e.saleId'는 테이블이나 별칭이 어디에서도 언급되지 않은 곳입니다. – Susang

+0

죄송합니다. 구문이 잘못되었습니다. 위의 내용은 기본 데이터를 설명하기 위해 내가하는 일이 너무 어렵고 질문과 관련이없는 것입니다. – Matt

답변

0

없음 일했다,하지만 난 사용하여 작업을 수행하기 위해 관리하고 내 가입 등 Outer Apply하고 있다는 점에서 정렬 순서를 지정했습니다.

모두에게 도움을줍니다.

0

아래 질문이 해결되기를 바랍니다. 귀하의 질문에 따라 매우 높은 수준의 초안을 작성했습니다. 문법이 아닌 개념만을 사용하십시오.

with maxSales as (select salesId, crit1 from sales s1 
     where cost = (select max(cost) from 
     sales s2 where s1.crit1 = s2.crit1)  
update products p set p.saleId = 
       (select s.saleId from 
        maxSales s 
        where s.crit1 = p.crit1 
        and p.someDate between s.startDate and s.endDate) 
0

그것이 바와 같이 saleID 설정할 및 당신이 찾고있는 sales 테이블, 당신은 아마 모든 products 기록을 업데이트 할 수 있습니다. 그런 다음 테이블에 간단한 update 문을 쓸 수 있으므로 가입 할 필요가 없습니다. 이 훨씬 쉽게이 작성할 수 있습니다 :

update products p 
set saleId = 
(
    select top(1) s.saleId 
    from sales s 
    where s.crit1 = p.crit1 
    and p.someDate between s.startDate and s.endDate 
    order by cost desc 
); 

명세서의 주요 차이점은 당신이 그대로을 할 수 있습니다 동안 sales 테이블에 일치하는 항목이없는 경우 나의 saleId = NULL 설정하는 것입니다. 그러나 나는 그것이 여기에 변화를주지 않는다고 생각합니다.

0

TRY THIS : 답변의

UPDATE p 
SET p.saleid = s.saleid 
FROM products p 
INNER JOIN 
    (SELECT s.crit1, 
      s.saleid 
    FROM sales s 
    WHERE cost IN 
     (SELECT max(cost) cost 
     FROM sales 
     GROUP BY crit1)) s ON s.crit1 = p.crit1 
0
UPDATE p 
    set p.saleId = e.rowNumber 
FROM products p 
INNER JOIN 
(SELECT saleId, row_number() OVER (ORDER BY saleId DESC) as rowNumber 
FROM sales) 
e ON e.saleId = p.saleId 
+1

전에 말씀 드린대로 다시 말씀 드리겠습니다. 스 니펫 도구를 잘못 사용하고 있습니다. 이 웹 사이트에서 * 실제로 실행 가능한 * HTML/JS/CSS에 사용하기위한 것입니다. 모든 코드가 아닙니다. –

+0

알려주십시오. @GrabNewTech와 같은 용도로 사용 하시겠습니까? –

+2

코드를 포함 할 때 (특히 HTML/JS/CSS 제외) 코드를 강조 표시하고 코드 도구 ('{}'모양)를 사용하십시오. HTML/JS/CSS를 포함하는 경우 스 니펫 도구 (페이지에서'<>'처럼 보임)를 사용하십시오. 내러티브 텍스트 만 포함하는 경우에는 사용하지 마십시오. –