在SQL Server中,如何选择共享公共列值的行?

时间:2013-11-25 02:51:08

标签: sql sql-server tsql

在我的表格中,我有以下数值:

ProductId  Type      Value      Group
200        Model     Chevy      Chevy
200        Year      1985       Chevy
200        Year      1986       Chevy
200        Model     Ford       Ford
200        Year      1986       Ford
200        Year      1987       Ford
200        Year      1988       Ford

在我的查询中,我想知道我的产品是否与特定年份的某个型号兼容。我正在尝试构建一个返回true或false的函数,具体取决于我传递给它的ProductId,Model和Value参数。要成为现实,函数必须匹配两个参数(模型和年份)以及表中的ProductId,但它们必须属于同一组。

例如,如果我将值200,Chevy,1988传递给函数,它必须返回False。请注意,表中找到了3个值,但它们属于不同的组。

另一方面,如果我将值200,Ford,1986传递给函数,它必须返回True,因为所有3个值都匹配并且属于同一组。

我认为这样做的方法有多个步骤,例如:

  1. 选择与模型匹配的所有记录,然后选择与年份匹配的所有记录,并将它们插入临时表中;
  2. 选择将组区分为另一个临时表;
  3. 遍历每个组,检查是否找到该组中的所有匹配项,当我找到时返回true,或者在函数结束时返回false。
  4. 我想知道是否有更好的方法只需一个SELECT命令即可在一步中执行此操作。

3 个答案:

答案 0 :(得分:0)

你可能过于复杂了。这应该足够了:

select exists(select * from Products where ProductId = 200 and Type = 'Year' and Value = 1986 and Group = 'Ford')

答案 1 :(得分:0)

要在一个查询中同时获取ModelValue,您可以自行加入表格:
(我假设该表名为products

select *
from products as models
inner join products as years 
    on models.productid = years.productid
    and models.group = years.group
where models.type = 'Model' and years.type = 'Year'

这会为您提供包含Chevy, 1985Chevy, 1986Ford, 1986等的行。

然后,您只需将您的值(例如200, Ford, 1986)放入WHERE子句中即可 因此,200, Ford, 1986的最终查询将如下所示:

select *
from products as models
inner join products as years 
    on models.productid = years.productid
    and models.group = years.group
where models.type = 'Model' and years.type = 'Year'
and models.productid = 200
and models.value = 'ford'
and years.value = '1986'

答案 2 :(得分:0)

只算数?

select 
    count(*)
from
    products
where
    ProductId = @ProductId and 
    (
        ( Type = 'Model' and Value = @Model ) or
        ( Type = 'Year' and Value = @Year ) or
    )

如果计数为2,那么你就会受到打击。