[英]SQL query select from table and group on other column
我对问题标题的措辞很差,因为我不确定该怎么称呼我想做的事情,但这确实应该很简单。
我有一个带有两个ID列的链接/联接表。 我想在将新行保存到表之前运行检查。
用户可以通过网页保存属性,但是在保存之前,我需要检查是否存在相同的组合。 有了一条记录,很容易,很明显,您只需检查该属性标识是否已在表中,如果不允许,则不允许他们再次保存它。
但是,如果用户选择了该属性和另一个属性的组合,则应允许他们保存该属性。
这是我的意思的图片:
因此,如果用户现在尝试保存ID为1的属性,它将停止它们,但是,如果他们尝试ID为1、10的情况,只要1和10具有相同的productAttributeId,我也需要它也将它们停止。
我在解释中混淆了这一点,但我希望图像能阐明我需要做什么。
这应该很简单,所以我想我缺少了一些东西。
如果我对问题的理解正确,则希望防止AttributeId
和ProductAttributeId
的组合被重用。 如果是这种情况,只需将它们组合为一个主键,这自然就是UNIQUE
。
如果这不可行,请创建一个存储过程,以对AttributeId
实例的AttributeId
运行查询。 如果查询返回0个实例,请插入行。
这是一些简短的代码来表达这个想法(可能需要修改才能与您的数据库一起使用):
SELECT COUNT(1) FROM MyJoinTable WHERE AttributeId = @RequestedID
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO MyJoinTable ...
END
您可以通过存储过程控制插入。 我的理解是
这些需要针对(新?)productAttributeId作为单个“批”输入表
因此,如果选择了(1,10),则需要将其阻止,因为1-2和10-2已经存在。
存储过程应将属性作为单个列表使用,例如'1,2,3'(逗号分隔,无空格,仅整数)
然后,您可以使用字符串拆分UDF或内联XML技巧(如下所示)将其拆分为派生表的行。
测试台
create table attrib (attributeid int, productattributeid int)
insert attrib select 1,1
insert attrib select 1,2
insert attrib select 10,2
我在这里使用一个变量,但是您可以将其作为SP输入参数
declare @t nvarchar(max) set @t = '1,2,10'
select top(1)
t.productattributeid,
count(t.productattributeid) count_attrib,
count(*) over () count_input
from (select convert(xml,'<a>' + replace(@t,',','</a><a>') + '</a>') x) x
cross apply x.x.nodes('a') n(c)
cross apply (select n.c.value('.','int')) a(attributeid)
left join attrib t on t.attributeid = a.attributeid
group by t.productattributeid
order by countrows desc
输出量
productattributeid count_attrib count_input
2 2 3
如果比较最后两列和计数
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.