我有两列不相关但必须包含类似值的列。例如,对于包含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。
答案 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
然后,您可以在Info1
和Info2
上设置唯一约束,以确保所有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