2014-11-26 1 views
4

주문이있는 MS SQL 데이터베이스가 있습니다. orers와 orderrows 두 테이블이 있습니다. 동일한 주문을 가진 모든 주문을 받고 싶습니다. 즉, 정확히 동일한 제품과 수량을 가진 주문을 표시하는 것입니다.자식 행 집합과 정확히 같은 Sql 상위 행을 찾습니다

enter image description here

사람이 뜨거운 알고 있나요 : 이것은 다음과 같은 결과를 얻을 수

select t1.orderid, t1.Itemcode, t1.quantity, t1.LineNum, t2.orderid, t2.Itemcode 
FROM orderrows t1 
    LEFT OUTER JOIN orderrows t2 ON t1.itemcode = t2.ItemCode and t1.quantity = t2.Quantity and t2.LineNum = t1.linenum 
    where t1.orderid <> t2.orderid 
    order by t1.orderid, t2.orderid 

:이 쿼리를 만든

CREATE TABLE [dbo].[orders](
    [orderid] [int] NULL 
) ON [PRIMARY] 

GO 

INSERT INTO orders values(1) 
INSERT INTO orders values(2) 
INSERT INTO orders values(3) 
INSERT INTO orders values(4) 

CREATE TABLE [dbo].[orderrows](
    [orderid] [int] NULL, 
    [LineNum] [int] NULL, 
    [Quantity] [decimal](18, 6) NULL, 
    [ItemCode] [nvarchar](20) NULL 
) ON [PRIMARY] 

GO 

INSERT INTO orderrows values(1,0,11.0,'Item1') 
INSERT INTO orderrows values(1,1,12.0,'Item2') 
INSERT INTO orderrows values(1,2,13.0,'Item3') 
INSERT INTO orderrows values(1,3,14.0,'Item4') 
INSERT INTO orderrows values(2,0,11.0,'Item1') 
INSERT INTO orderrows values(2,1,12.0,'Item2') 
INSERT INTO orderrows values(2,2,13.0,'Item3') 
INSERT INTO orderrows values(2,3,14.0,'Item4') 
INSERT INTO orderrows values(3,0,11.0,'Item1') 
INSERT INTO orderrows values(3,1,12.0,'Item2') 
INSERT INTO orderrows values(4,0,15.0,'Item5') 
INSERT INTO orderrows values(4,1,16.0,'Item6') 

:

테이블과 데이터를 작성 십자가 행을 제거 하시겠습니까? 이 주문은 정확한 일치는 아니지만 주문의 하위 집합 만 있습니다. 예 : 행 5와 6은 순서 3을 표시하지만이 순서는 item1과 item2 만 있습니다.

+0

정확하게 이해하면 각 주문의 전체 행 세트를 다른 전체 세트와 비교해야합니다. 또한 SqlQuery가 비교에서 'LineNum'을 사용하는 반면 '정확히 동일한 제품 및 수량'을 명확히 할 수 있습니까? 'LineNums'가 전환되었지만 Order Items와 Quantities가 동일하면 다른 것으로 간주되는 순서입니다 ? – StuartLC

+1

"같은 순서"의 정의는 내부 토론을 위해 열렸습니다 - 우리는 비교에서 LineNum을 폐기했습니다. 그래서 @StuartLC의 솔루션을 테스트하고 승인했습니다. 감사합니다! – Rollufje

+0

'LineNum'을 믹스에 추가하는 것은 'SELECT ItemCode, Quantity, LineNum ...'과 같이 4x select에 추가하는 것만 큼 쉽습니다. – StuartLC

답변

3

다음과 같은 한 가지 방법이 있습니다. 주문 주문의 모든 조합을 구축 한 다음 EXCEPT을 사용하여 불일치 주문을 제거합니다. 나는 LineNum가 '정확한'비교와 관련이 없다고 추측하고 있습니다.

이 반드시이 작업을 수행하는 가장 효율적인 방법은 아니다
-- Build up all combinations of orders 
WITH orderPairs AS 
(
    select o1.orderid as orderid1, o2.orderid as orderid2 
    from orders o1 
     cross join orders o2 
    where 
     o1.orderid > o2.orderid -- prevent self matches, and duplicate checks 
) 
SELECT * 
    FROM orderPairs op 
    WHERE 
    NOT EXISTS 
    -- All in O1 are in O2 
    (SELECT ItemCode, Quantity 
     FROM orderrows orw1 
     WHERE orw1.orderid = op.orderid1 

     EXCEPT 

     SELECT ItemCode, Quantity 
     FROM orderrows orw2 
     WHERE orw2.orderid = op.orderid2) 

    AND NOT EXISTS 

    -- All in O2 are in O1 
    (SELECT ItemCode, Quantity 
    FROM orderrows orw2 
     WHERE orw2.orderid = op.orderid2 

     EXCEPT 

     SELECT ItemCode, Quantity 
     FROM orderrows orw1 
     WHERE orw1.orderid = op.orderid1) 

즉이 Order1Order2이 동일하다는 것을 나타내는

SqlFiddle here (예를 들어, 초기 행 수는 라인 매칭하여 선을 피할 수).

관련 문제