使用UNION将数据导入网格

时间:2016-09-21 03:54:03

标签: sql tsql query-string

我的网站上有一个数据网格,我从2个表中提取公司信息。

我创建了一个表单,根据3个过滤器(类别,州,城市)对这些结果进行排序

这是我最初将数据加载到网格中的查询。我希望它填充所有我的表数据UNTIL用户决定过滤它,这就是为什么我使用UNION没有它我的查询等待我传递查询字符串值来完成它#s; s WHERE声明。

SELECT * FROM BND_listing left join BND_ListingCategories
on BND_Listing.CatID=BND_ListingCategories.CatID

UNION

SELECT * FROM BND_listing left join BND_ListingCategories
on BND_Listing.CatID=BND_ListingCategories.CatID
WHERE (CategoryName = '[querystring:filter-Category]' OR     '[querystring:filter-Category]' is NULL)

我不确定这是否是正确的程序。

我很难理解此查询的NULL参数。在页面加载时,没有查询字符串。

只有用户按下" SORT"按钮将查询字符串添加到URL中。用户可以选择按1或全部3个过滤器排序,但在这种情况下,他们只按1个选项排序。查询字符串将为其他两个单独传递ALL。

IE:filter-Category / Barber%20Shop / filter-City / All / filter-State / All 在这里,用户只选择' Barber Shop'从1下拉并离开城市&状态下降作为默认选择。

我的查询是"听"查询字符串参数在我的应用程序上无法正常工作。但是,在SQL Management Studio中使用以下内容时,它会正确地提取我的记录。

SELECT * FROM BND_listing left join BND_ListingCategories
on BND_Listing.CatID=BND_ListingCategories.CatID
WHERE (CategoryName = 'Barber Shop' OR '[querystring:filter-Category]' is      NULL)

这将是我的所有3"倾听"的数据网格查询。包括WHERE语句。

SELECT * FROM BND_listing left join BND_ListingCategories
on BND_Listing.CatID=BND_ListingCategories.CatID

UNION

SELECT * FROM BND_listing left join BND_ListingCategories
on BND_Listing.CatID=BND_ListingCategories.CatID
WHERE (CategoryName = '[querystring:filter-Category]' OR     '[querystring:filter-Category]' is NULL)
AND (city = '[querystring:filter-City]' OR '[querystring:filter-City]' IS     NULL)
AND (state ='[querystring:filter-State]' OR '[querystring:filter-State]' IS     NULL)

任何帮助,输入,示例,洞察力都非常感谢!

在线& SQL Studio     enter image description here     enter image description here     enter image description here     enter image description here

2 个答案:

答案 0 :(得分:1)

联盟不会为你提供你想要的东西。它的目的是将两个或多个查询的结果连接在一起,保持不同的值。在您的情况下,联合的前半部分捕获所有数据,后半部分捕获过滤的数据。由于上半部分全部捕获,所有返回。

您似乎是这样做的,因为您没有第一次运行的过滤器,但您希望第二次运行时使用过滤器。

如果查询字符串不存在,请不要添加where子句。如果他们在场,请添加地点和适当的条款。

您提到排序但您的查询缺少order by子句。 如果要对数据进行排序,您将要添加一个。

第一次加载,没有where子句或所有过滤器都设置为' ALL'

SELECT * FROM BND_listing left join BND_ListingCategories
on BND_Listing.CatID=BND_ListingCategories.CatID
order by CategoryName, state, city

后续加载,where where子句。

SELECT * FROM BND_listing left join BND_ListingCategories
on BND_Listing.CatID=BND_ListingCategories.CatID
WHERE (CategoryName = '[querystring:filter-Category]' OR     '[querystring:filter-Category]' is NULL)
AND (city = '[querystring:filter-City]' OR '[querystring:filter-City]' IS     NULL)
AND (state ='[querystring:filter-State]' OR '[querystring:filter-State]' IS     NULL)
order by CategoryName, state, city

编辑:您不能拥有2个查询,因为该插件只允许1。

我假设通过"听"你的意思是查询字符串:filter-Category将被类别查询字符串中的任何内容替换。由于它已在您的查询中被替换,因此您无法与null进行比较。因为没有过滤器是'所有'你需要考虑到这一点。 试试这个:

SELECT * 
FROM BND_listing 
left join BND_ListingCategories
    on BND_Listing.CatID=BND_ListingCategories.CatID
WHERE   
    (
        '[querystring:filter-Category]' = 'ALL' -- for when the queryString is set to ALL
        or '[querystring:filter-Category]' = '' -- for when the queryString isn't available like first load. this replaces the is null comparison. you can't compare a string literal to null as they are wrapped in quotes
        or CategoryName = '[querystring:filter-Category]' -- this is the comparison to your column
    )
    AND (
         '[querystring:filter-City]' = 'ALL'
        or '[querystring:filter-City]' = ''
        or city = '[querystring:filter-City]' 
    )
    AND (
        '[querystring:filter-State]'  = 'ALL'
        or '[querystring:filter-State]' = ''
        or state = '[querystring:filter-State]' 
    )
order by CategoryName, state, city

答案 1 :(得分:0)

感谢您提供所有帮助&例子。我能够对我的查询进行排序,实际上我遇到了需要首先解决的网格问题。

select * FROM BND_listing right join BND_ListingCategories
on BND_Listing.CatID=BND_ListingCategories.CatID
where 
(CategoryName = '[querystring:filter-Category]' or '[querystring:filter-    Category]'='All')
and
(City = '[querystring:filter-City]' or '[querystring:filter-City]'='All')
and
(Region= '[querystring:filter-State]' or '[querystring:filter-State]'='All')
and
(Country= '[querystring:filter-Country]' or '[querystring:filter-    Country]'='All')

我只是有一个页面重定向,它总是为我的所有查询字符串过滤器传递至少一个ALL值,这些过滤器填充了我的网格。