我有一个包含三个数据列的表:
DATE ID1 ID2
//
2012-10-01 5 9
2012-10-01 3 6
2012-10-01 1 7
2012-10-01 0 2
2012-10-01 8 4
//
2012-10-08 6 5
2012-10-08 5 8 >>> should FLAG!
//
2012-10-15 9 6
2012-10-15 3 4
2012-10-15 9 7 >>> should FLAG!
//
对于每个DATE分组,ID1和ID2中的ID应该是唯一的。
在我输入了一年的数据之后,我可以运行哪些查询来检查我是否还没有找到任何ID?
我可以通过每次输入日期来手动检查:
SELECT id FROM table a JOIN table b ON a.id = b.id
WHERE a.date = 2012-10-01 AND a.ID1 = b.ID1 ...
然而,对于一年的约会,这并不实际。
答案 0 :(得分:1)
您可以使用此查询:
SELECT date, id1, id2 FROM data d
WHERE EXISTS (
SELECT * FROM data d2
WHERE d2.date = d.date AND (
d2.id1 = d.id2 OR d2.id2 = d.id1
OR (d.id1=d2.id1 AND d.id2 <> d2.id2)
OR (d.id2=d2.id2 AND d.id1 <> d2.id1)
)
)
这将选择id与同一日期的另一个id匹配的行,或者只选择其中一个id匹配(但不是两者)。
编辑:修正了@ a1ex07
注明的第二种情况编辑2 :以下替代方案。
或者如果您愿意,这也是等效的:
SELECT d.date, d.id1, d.id2 FROM data d
INNER JOIN (
SELECT date, id FROM (
SELECT date, id1 AS id FROM data
UNION ALL
SELECT date, id2 AS id FROM data
) AS tmp
GROUP BY date, id HAVING COUNT(*) > 1
) AS dupes
WHERE d.date = dupes.date AND (d.id1 = dupes.id OR d.id2 = dupes.id)
答案 1 :(得分:0)
您可以group by
日期和count
:
SELECT `date`, `id1`, COUNT (*)
FROM `my_table`
GROUP BY `date`
HAVING COUNT(*) > 1
重复id2
的过程。
答案 2 :(得分:0)
在创建表时,对ID1和ID2设置唯一约束。
答案 3 :(得分:0)
这可能不是最简单的解决方案,但我认为它可以满足您的需求。基本上我创建了一个临时表(不是真正的临时表,只是一个表,如果你不需要它就可以删除),它将col1和col2中的id存储在一个字段中。然后将col1和col2值插入临时表并运行一个简单查询以提取任何具有计数&gt;的ID。 1.我将colName字段添加到临时表中,以防您需要跟踪值来自哪个id列。
CREATE TABLE temp (
date DATE,
id SMALLINT,
colName VARCHAR(10)
);
INSERT INTO temp
SELECT date, id1, 'id1'
FROM table;
INSERT INTO temp
SELECT date, id2, 'id2'
FROM table;
SELECT date, id, COUNT(id) AS total
FROM temp
GROUP BY date, id
HAVING COUNT(id) > 1;
如果你经常运行它,你可以创建一个存储过程并以这种方式调用它。