在 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 查询中同时获取 Model
和 Value
,您可以将表连接到自身:(我假设表名为 @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, 1985
、Chevy, 1986
、Ford, 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 SELECT 语句返回新的 IDENTITY 列值?