1

SQL Server マネジメント スタジオ 2005

ユーザーが説明、原産国、ブランド名、栽培方法などのさまざまなカテゴリを検索できるようにするクエリを作成しました。ユーザーは必要な数のフィルターにデータを入力でき、返される結果は入力内容に基づいています。

以下は、このクエリの作業バージョンです。ただし、これは、以前に書いた元のクエリを SSMS が再フォーマットした方法です。このフィルターにさらに 2 つの列を追加できるように、以前にどのように記述したかを理解する必要があります。

    SELECT DISTINCT masterCorporateGtin.SupplierNo, masterCorporateGtin.GTIN, masterCorporateGtin.Description, masterCorporateGtin.Commodity, masterCorporateGtin.Variety, masterCorporateGtin.CoO, masterCorporateGtin.PackSize, masterCorporateGtin.BrandName, masterCorporateGtin.GrowMethod, masterCorporateGtin.Grade
    FROM         GTINs AS masterCorporateGtin INNER JOIN
        (SELECT DISTINCT SupplierNo, GTIN, Description, CoO, PackSize, BrandName, GrowMethod, Grade
        FROM          GTINs AS masterCorporateGtin
        WHERE      (Description LIKE '%' + @productDescription + '%') AND (BrandName LIKE '%' + @brandName + '%') AND
        (GrowMethod LIKE '%' + @growmethod + '%') AND (CoO = @countryoforigin) OR
        (Description LIKE '%' + @productDescription + '%') AND (BrandName LIKE '%' + @brandName + '%') AND (CoO = @countryoforigin) AND
        (@growmethod IS NULL) OR
        (Description LIKE '%' + @productDescription + '%') AND (BrandName LIKE '%' + @brandName + '%') AND
        (GrowMethod LIKE '%' + @growmethod + '%') AND (@countryoforigin IS NULL) OR
        (Description LIKE '%' + @productDescription + '%') AND (BrandName LIKE '%' + @brandName + '%') AND (@growmethod IS NULL) AND
        (@countryoforigin IS NULL) OR
        (Description LIKE '%' + @productDescription + '%') AND (GrowMethod LIKE '%' + @growmethod + '%') AND (CoO = @countryoforigin) AND
        (@brandName IS NULL) OR
        (Description LIKE '%' + @productDescription + '%') AND (CoO = @countryoforigin) AND (@growmethod IS NULL) AND
        (@brandName IS NULL) OR
        (Description LIKE '%' + @productDescription + '%') AND (GrowMethod LIKE '%' + @growmethod + '%') AND (@countryoforigin IS NULL) AND
        (@brandName IS NULL) OR
        (Description LIKE '%' + @productDescription + '%') AND (@growmethod IS NULL) AND (@countryoforigin IS NULL) AND
        (@brandName IS NULL) OR
        (BrandName LIKE '%' + @brandName + '%') AND (GrowMethod LIKE '%' + @growmethod + '%') AND (CoO = @countryoforigin) AND
        (@productDescription IS NULL) OR
        (BrandName LIKE '%' + @brandName + '%') AND (CoO = @countryoforigin) AND (@growmethod IS NULL) AND
        (@productDescription IS NULL) OR
        (BrandName LIKE '%' + @brandName + '%') AND (GrowMethod LIKE '%' + @growmethod + '%') AND (@countryoforigin IS NULL) AND
        (@productDescription IS NULL) OR
        (BrandName LIKE '%' + @brandName + '%') AND (@growmethod IS NULL) AND (@countryoforigin IS NULL) AND
        (@productDescription IS NULL) OR
        (GrowMethod LIKE '%' + @growmethod + '%') AND (CoO = @countryoforigin) AND (@brandName IS NULL) AND
        (@productDescription IS NULL) OR
        (GrowMethod LIKE '%' + @growmethod + '%') AND (@countryoforigin IS NULL) AND (@brandName IS NULL) AND
        (@productDescription IS NULL) OR
        (CoO = @countryoforigin) AND (@growmethod IS NULL) AND (@brandName IS NULL) AND (@productDescription IS NULL) OR
        (@growmethod IS NULL) AND (@countryoforigin IS NULL) AND (@brandName IS NULL) AND (@productDescription IS NULL))
        AS productFilter ON masterCorporateGtin.Description = productFilter.Description AND masterCorporateGtin.BrandName = productFilter.BrandName AND
        masterCorporateGtin.GrowMethod = productFilter.GrowMethod AND masterCorporateGtin.CoO = productFilter.CoO

私が覚えている限りでは、これまでに行ったことは以下のようなものでした。WHERE句にステートメントを1つずつ追加して、それらが機能するかどうかを確認しただけだと思います。これをもう一度試しましたが、うまくいきませんでした。洞察をいただければ幸いです。ありがとうございました。

    SELECT DISTINCT masterCorporateGtin.SupplierNo, masterCorporateGtin.GTIN,         masterCorporateGtin.Description, masterCorporateGtin.Commodity,         masterCorporateGtin.Variety, masterCorporateGtin.CoO, masterCorporateGtin.PackSize,         masterCorporateGtin.BrandName, masterCorporateGtin.GrowMethod, masterCorporateGtin.Grade
    FROM         GTINs AS masterCorporateGtin INNER JOIN
    (SELECT DISTINCT SupplierNo, GTIN, Description, Commodity, PackSize, BrandName,         GrowMethod, Grade
    FROM          GTINs AS masterCorporateGtin
    WHERE      (Description LIKE '%' + @productDescription + '%') OR
    (@productDescription IS NULL)) AS searchFilter ON masterCorporateGtin.Description =         searchFilter.Description
4

1 に答える 1

0

括弧に何か問題があるようです...通常、次のようにします:

((@somefield IS NULL) OR (SomeField = @somefield))

たとえば、クエリを正しく読んでいれば、@brandname が null の場合、すべての結果が返されます。クエリには多くの冗長なステートメントがあり、ステートメントをグループ化するための外側の括弧が欠落しているようです。

于 2013-07-11T01:50:02.593 に答える