【问题标题】:How can I filter with a derived table in MS SQL Server?如何在 MS SQL Server 中使用派生表进行筛选?
【发布时间】:2013-07-09 03:32:58
【问题描述】:

SQL Server 管理工作室 2005

我编写了一个查询,允许用户搜索各种类别,例如描述、原产国、品牌名称和种植方法。用户可以为任意数量的过滤器输入数据,并且返回的结果将基于他们输入的内容。

以下是此查询的工作版本;然而,这就是 SSMS 重新格式化我之前编写的原始查询的方式。我需要尝试弄清楚我之前是如何编写它的,这样我才能在这个过滤器中再添加两列:

    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 子句中一一添加语句,看看它们是否有效。我又试了一次,但没有用。我会很感激任何见解。谢谢。

    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

【问题讨论】:

    标签: sql-server-2005 subquery correlated-subquery derived-table


    【解决方案1】:

    你的括号似乎有些不对劲......通常你会这样做:

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

    例如,如果我正确阅读了您的查询,如果@brandname 为空,则所有结果都将返回。您的查询中似乎有很多多余的语句,并且缺少用于分组语句的外括号。

    【讨论】:

    • 谢谢。这有助于引导我朝着正确的方向前进。这几乎是括号和分组的问题。然而,在我重新组合它们之后,SSMS 并没有像以前那样以自己的格式重新编码,这对我来说有点有趣。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 2020-07-22
    • 1970-01-01
    • 2021-03-21
    • 2018-10-08
    • 2021-08-09
    相关资源
    最近更新 更多