SQL查询从其他列上的表和组中选择

时间:2011-02-19 12:20:10

标签: sql sql-server grouping

我对问题标题的描述很差,因为我不确定该怎么称呼我应该做的事情,但它确实应该很简单。

我有一个带有两个ID列的链接/连接表。我想在将新行保存到表之前运行检查。

用户可以通过网页保存属性,但我需要在保存之前检查相同的组合是否存在。使用一条记录很容易,因为显然你只是检查该属性是否已经在表中,如果它不允许它们再次保存它。

但是,如果用户选择该属性和另一个属性的组合,则应允许他们保存该属性。

这是我的意思的图像:

enter image description here

因此,如果用户现在尝试保存ID为1的属性,它将停止它们,但是如果他们尝试ID为1,10,我需要它也停止它们,只要1和10都具有相同的productAttributeId。

我在解释中对此感到困惑,但我希望这张图片能说明我需要做些什么。

这应该很简单所以我认为我错过了一些东西。

2 个答案:

答案 0 :(得分:0)

如果我正确理解了问题,您希望阻止重复使用AttributeIdProductAttributeId的组合。如果是这种情况,只需将它们组合成一个主键,这本质上是UNIQUE

如果这不可行,请创建一个存储过程,针对AttributeId的实例运行针对连接的查询。如果查询返回0个实例,请插入该行。

这里有一些轻量代码来展示这个想法(可能需要修改才能使用你的数据库):

SELECT COUNT(1) FROM MyJoinTable WHERE AttributeId = @RequestedID
IF @@ROWCOUNT = 0
BEGIN
   INSERT INTO MyJoinTable ...
END

答案 1 :(得分:0)

您可以通过存储过程控制插入。我的理解是

  1. 用户可以选择属性的组合,例如
    • 只是1
    • 1和10在一起
    • 1,4,5,10(4个属性)
  2. 这些需要作为针对(new?)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
    
    1. 第1列为您提供匹配最多的productattributeid
    2. 第二列为您提供使用相同productattributeid
    3. 匹配的属性数
    4. 第3列是输入中存在多少属性
    5. 如果比较最后2列和计数

      1. 匹配 - 您可以使用productattributeid附加到具有所有这些属性的产品
      2. 不匹配 - 然后您需要执行插入以创建新组合