sql >> データベース >  >> RDS >> Sqlserver

一連の値をすべて含むグループを選択する SQL ステートメント

    OrderDetails テーブルに OrderId と ProductId の一意の制約が含まれている場合は、次のようにすることができます:

    Select ...
    From Orders As O
    Where Exists    (
                    Select 1
                    From OrderDetails As OD1
                    Where OD1.ProductId In(1,2,3)
                        And OD1.OrderId = O.Id
                    Group By OD1.OrderId
                    Having Count(*) = 3
                    )
    

    同じ注文で同じ ProductId を複数回使用できる場合は、Having 句を Count(Distinct ProductId) = 3 に変更できます。

    さて、上記を考えると、各注文に同じ署名があり、製品エントリが重複している状況が必要な場合は、より注意が必要です。これを行うには、問題の製品に対する問題の注文の署名が必要であり、その署名を照会します:

    With OrderSignatures As
        (
        Select O1.Id
            ,   (
                Select '|' + Cast(OD1.ProductId As varchar(10))
                From OrderDetails As OD1
                Where OD1.OrderId = O1.Id
                Order By OD1.ProductId
                For Xml Path('')
                ) As Signature
        From Orders As O1
        )
    Select ...
    From OrderSignatures As O
        Join OrderSignatures As O2
            On O2.Signature = O.Signature
                And O2.Id <> O.Id
    Where O.Id = 5
    


    1. mysqlのプリペアドステートメントを使用する方が、一般的なエスケープ関数を使用するよりも安全なのはなぜですか?

    2. とにかくMySQLクエリの実行時間を制限しますか?

    3. Read Committedは、Postgres互換の分散SQLデータベースには必須です

    4. Hibernateセッションをトランザクション用に開くことができませんでした