在多行上约束数据

时间:2014-07-10 20:02:38

标签: sql sql-server

我有两列不相关但必须包含类似值的列。例如,对于包含Info1=100的每一行,每个Info2必须相同。同样必须如此,每个Info2=Broccoli必须具有相同的Info1。在下面的表中,ID 1和2将通过,ID 3,4和5将失败。

ID Info1   Info2
---------------------
1  100      Pizza
2  100      Pizza
3  200      Carrots
4  200      Carrots
5  200      Broccoli
6  300      Broccoli

我正在尝试创建两个查询,一个将显示已通过的ID,另一个将显示失败的ID。

2 个答案:

答案 0 :(得分:0)

我不知道任何系统会允许像那样的声明式约束。一种解决方案是使用查询找到无效组合:

SELECT Info1
FROM
(
SELECT DISTINCT Info1, Info2
FROM table
)
GROUP BY Info1
HAVING COUNT(*) > 1

SELECT Info2
FROM
(
SELECT DISTINCT Info1, Info2
FROM table
)
GROUP BY Info2
HAVING COUNT(*) > 1

更好的解决方案是规范化数据:

ID Info1 
1  100  
2  100     
3  200     
4  200     
5  200    
6  300  

Info1   Info2
100      Pizza
200      Carrots
300      Broccoli

然后,您可以在Info1Info2上设置唯一约束,以确保所有Info2值都具有唯一Info1

答案 1 :(得分:0)

是的,正如D Stanley所说的那样,你正确地将数据标准化了。要确定您可以在此示例中执行的问题:

declare @tab table(
    id int
    ,info1 int
    ,info2 varchar(20)
)

insert into @tab
values
    (1,  100, 'Pizza'),
    (2,  100, 'Pizza'),
    (3,  200, 'Carrots'),
    (4,  200, 'Carrots'),
    (5,  200, 'Broccoli'),
    (6,  300, 'Broccoli')

select info1, count(distinct info2) as info2distinct
from @tab t
group by info1
having count(distinct info2) > 1