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

Posted

技术标签:

【中文标题】在 SQL Server 中,如何选择共享公共列值的行?【英文标题】:In SQL Server, how to SELECT rows that share a common column value? 【发布时间】:2013-11-25 02:51:08 【问题描述】:

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

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。确实,Function 必须匹配两个参数(Model 和 Year)以及表中的 ProductId,但它们必须属于同一组。

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

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

我认为一种方法是分多个步骤,例如:

    选择与模型匹配的所有记录,然后选择与年份匹配的所有记录,并将它们插入到临时表中; 选择不同的组到另一个临时表; 循环遍历每个组,检查是否在该组中找到所有匹配项,找到时返回 true,在函数结束时返回 false。

我想知道是否有更好的方法,只使用一个 SELECT 命令一步完成。

【问题讨论】:

【参考方案1】:

要在 one 查询中同时获取 ModelValue,您可以将表连接到自身:(我假设表名为 @987654323 @)

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】:

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

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

【讨论】:

组与参数无关。重要的是结果应该属于同一组。在上面的示例中,我想知道这个特定产品是否适合(型号 = Chevy AND Year = 1988),无论型号和年份属于哪个组,只要它是同一个组。【参考方案3】:

数一下怎么样?

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

如果计数是 2,那么你就成功了。

【讨论】:

以上是关于在 SQL Server 中,如何选择共享公共列值的行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 sql server 2008 中交换列值?

如何从 SQL Server SELECT 语句返回新的 IDENTITY 列值?

SQL Server 中是不是有一种方法可以显示两个具有相同布局并共享一些公共数据的表之间的字段差异

在sql server中将xml列值编码为xml

如何更改sql server中的默认列值

如何根据列值SQL Server扩展表[重复]