0

私はレポートを書いていますが、同じセットに参加するアイテムを見つける方法があるかどうか疑問に思っていましたか?

たとえば、次のクエリでは、同じ製品セットに結合するすべての領域を検索したいと考えています。

SELECT Area.Name, AggregateSetOfProductsId
FROM Area
INNER JOIN AreaToProduct ON AreaToProduct.AreaId = Area.Id
GROUP BY Area.Id

私が考えることができる現在の最善の解決策は、ProductIdのuniqueidentifiersを一緒にハッシュするカスタム集計を作成することでした(あるバイトに基づいて右にシフトし、それらを一緒にxorするなど)が、行く前にもっと簡単な方法があるかどうか尋ねると思いましたそれを通して。

4

3 に答える 3

1

これは、set操作で実行できます。ここでは、まったく同じ商品を含むすべてのorderidをnorthwindから取得する方法を示します(これは、まったく同じ商品が含まれるエリアです)。

select distinct o1.orderid 
from orders o1 inner join orders o2 on o1.orderid!=o2.orderid
where not exists
    (
        select * from [order details] od2
        where od2.orderId=o2.Orderid
            and od2.ProductId NOT IN 
            (
                select productid from [order details] od1
                where od1.OrderId=o1.OrderId
            )
    )
    and not exists
    (
        select * from [order details] od1
        where od1.orderId=o1.Orderid
            and od1.ProductId NOT IN 
            (
                select productid from [order details] od2
                where od2.OrderId=o2.OrderId
            )
    )

考え方は基本的にこれです:o1の製品のリストにない製品がなく、o2の製品のリストにないo1の製品がない注文o2が存在する注文o1を返します。

于 2009-05-13T08:27:00.177 に答える
1

これは、共通テーブル式を使用して簡単に行うことができます。FOR XML PATH を使用して配列を作成し、その配列を使用して一致する製品を識別します。このような:

;WITH AreaProductSets
AS
(
SELECT a.AreaID, a.Name, 
                SUBSTRING((SELECT (', ' + CAST(ap.ProductID AS varchar(20)))
                                    FROM AreaToProduct ap
                                    WHERE ap.AreaID = a.AreaID
                                    ORDER BY ap.ProductID
                                    FOR XML PATH ('')), 3, 2000) AS ProductArray
FROM        Area AS a
)
SELECT  SUBSTRING((SELECT   (', ' + CAST(aps2.Name AS varchar(20)))
                                    FROM        AreaProductSets aps2
                                    WHERE   aps2.ProductArray = aps.ProductArray
                                    ORDER BY aps2.AreaID
                                    FOR XML PATH('')), 3, 2000) AS MatchingAreas,
                aps.ProductArray
FROM        (SELECT DISTINCT ProductArray FROM AreaProductSets) AS aps
于 2009-05-13T05:33:35.377 に答える
0

おそらくEXCEPT演算子を使用しますか?2 つのセット間の EXCEPT が空の場合、セットは同一です。http://msdn.microsoft.com/en-us/library/ms188055.aspxを参照してください。 また、結果セットをハッシュするには、CHECKSUM_AGG(BINARY_CHECKSUM(*)) などの組み込み集計を使用できます。http://msdn.microsoft を参照してください。 com/en-us/library/ms188920.aspx

于 2009-05-13T03:12:36.073 に答える