我试图弄清楚SQL是否对表中的记录集进行了一些相对简单的操作,但是我被卡住了。考虑一个每个项目有多行的表,所有这些都由一个公共密钥标识。
例如:
serial model color
XX1 A blue
XX2 A blue
XX3 A green
XX5 B red
XX6 B blue
XX1 B blue
我想要做的是:
假设所有模型A行必须具有相同的颜色,请找到不行的行。 (例如,XX3为绿色)。
假设给定的序列号只能指向单一类型的模型,请找出不会发生的行(例如XX1指向A和B)
这些都是简单的逻辑事情。要抽象它,我想知道如何使用单个键(或键组合)对事物进行分组,然后比较这些记录的值。
我应该在同一张桌子上使用联接吗?我应该使用某种类型的数组还是类似的?
感谢您的帮助
答案 0 :(得分:3)
适用于1:
SELECT model, color, COUNT(*) AS num FROM yourTable GROUP BY model, color;
这将为您提供每个模型的列表以及该模型的每种颜色以及计数。因此,数据集的输出将为:
model color num
A blue 2
A green 1
B red 1
B blue 2
通过此输出,您可以轻松查看错误并使用UPDATE语句进行修复,或进行全面操作,为每个模型指定最常用的颜色。
2:
SELECT serial, COUNT(*) AS num FROM yourTable GROUP BY serial HAVING num > 1
这个的输出是:
serial num
XX1 2
答案 1 :(得分:0)
要解决#1问题,我会使用自联接(在同一个表上的联接,就像你所说的那样)。
例如,
select *
from mytable
where serial in (select serial
from mytable
group by model, color
having count(*) = 1)
会找到仅存在一种颜色的所有序列号。我没有对此进行测试,但我希望你能看到它的作用。内部选择查找仅出现一次的所有记录,然后外部选择显示这些连续出现的所有详细信息。
当然,话虽如此,这是一个糟糕的桌面设计。但我不认为这是你的问题。我希望这是一个真实情况的例子。我担心的是没有理由认为单一事件实际上是坏的 - 可能有10条记录,所有记录都有不同的颜色。这种方法会告诉你所有这些都是错的,你将无法确定哪个是正确的。