2015-07-11 77 views
0

我有以下哪些是有重复记录对于不同领域的表:表多个SQL查询联盟

CREATE TABLE Student1 
    (`id` int,`status` int,`amount` int , `Name` varchar(10), `date` varchar(55)) 
; 
    INSERT INTO Student1 
    (`id`,`status`,`amount`, `Name`, `date`) 
VALUES 
    (1,0,4500, 'ram', '04/02/2012'), 
    (2,0,2000, 'shyam', '05/09/2013'), 
    (4,0,1500, 'ghanshyam', '08/11/2014'), 
    (3,0,4500, 'gopal', '04/02/2012'), 
    (2,0,8000, 'radheshyam', '15/11/2013'), 
    (4,1,1500, 'ghanshyam', '18/10/2015'), 
    (1,1,4500, 'ram', '14/02/2012'), 
    (2,0,6500, 'radhe', '11/11/2014'), 
    (3,1,4500, 'gopal', '14/02/2015'), 
    (5,1,4500, 'gopala', '04/02/2015'), 
    (5,1,4500, 'gopala', '04/02/2015'), 
    (6,0,14500, 'gopal', '14/02/2015') 
; 

我有3个条件来过滤表:

  1. 没有完全重复的记录
  2. 如果使用相同的id但不同的Namedate字段记录,则将其全部添加到最终结果中
  3. 如果status=1任何记录,然后选择相应的id
  4. 该记录与id不同的id添加所有记录上述3个条件

我写了这个查询:

SELECT * FROM Student1 
GROUP BY id,status,amount,Name,date 
HAVING COUNT(*) > 1 

UNION 

SELECT * FROM Student1 Student1 
WHERE id IN 
(
SELECT id FROM Student1 
GROUP BY id 
HAVING COUNT(DISTINCT name) > 1 
AND COUNT(DISTINCT date) > 1 
) 

UNION 

SELECT * FROM Student1 Student1 
WHERE status=1 AND id IN 
(
SELECT id FROM Student1 
GROUP BY id 
HAVING COUNT(id) >= 2 
); 

结果:

id status amount Name date 
4 1 1500 ghanshyam 18/10/2015 
1 1 4500 ram 14/02/2012 
3 1 4500 gopal 14/02/2015 
5 1 4500 gopala 04/02/2015 
2 0 2000 shyam 05/09/2013 
2 0 8000 radheshyam 15/11/2013 
2 0 6500 radhe 11/11/2014 

正如你所看到的第一个选择避免d第二个选择相同的记录id有不同的Namedate,第三个选择要获得记录id=1。我正在使用UNION以避免重复结果。

现在我需要添加第4个查询来获取记录id=6这是不存在于上述所有条件。

预期结果:

id status amount Name date 
4 1 1500 ghanshyam 18/10/2015 
1 1 4500 ram 14/02/2012 
3 1 4500 gopal 14/02/2015 
5 1 4500 gopala 04/02/2015 
2 0 2000 shyam 05/09/2013 
2 0 8000 radheshyam 15/11/2013 
2 0 6500 radhe 11/11/2014 
6 0 14500 gopal 14/02/2015 

我需要解决的第4个查询。请帮忙。

回答

0

如果你想过滤的唯一条件,是id = 6,这是不够的,只是补充:

SELECT * FROM Student1 WHERE id=6; 

哪个是你的请求转换成SQL的直接翻译。完整版将为:

SELECT * FROM Student1 
    GROUP BY id,status,amount,Name,date 
    HAVING COUNT(*) > 1 

UNION 

SELECT * FROM Student1 Student1 
    WHERE id IN 
    (
    SELECT id FROM Student1 
    GROUP BY id 
    HAVING COUNT(DISTINCT name) > 1 
    AND COUNT(DISTINCT date) > 1 
) 

UNION 

SELECT * FROM Student1 Student1 
    WHERE status=1 AND id IN 
    (
    SELECT id FROM Student1 
    GROUP BY id 
    HAVING COUNT(id) >= 2 
) 

UNION 

SELECT * FROM Student1 WHERE id=6; 

结果是按要求但按不同的顺序。 DEMO

不过,如果你想获得的所有id哪些不是你的coditions过滤,但你不知道自己的价值,我会用一个VIEW

CREATE VIEW Student2 AS 
    SELECT * FROM Student1 
    GROUP BY id,status,amount,Name,date 
    HAVING COUNT(*) > 1 

UNION 

SELECT * FROM Student1 Student1 
    WHERE id IN 
    (
    SELECT id FROM Student1 
    GROUP BY id 
    HAVING COUNT(DISTINCT name) > 1 
    AND COUNT(DISTINCT date) > 1 
) 

UNION 

SELECT * FROM Student1 Student1 
    WHERE status=1 AND id IN 
    (
    SELECT id FROM Student1 
    GROUP BY id 
    HAVING COUNT(id) >= 2 
); 

And then query with it: 

SELECT * FROM Student2 

UNION 

SELECT * FROM Student1 WHERE id NOT IN (SELECT id FROM Student2); 

的结果是一样的。 DEMO

+0

感谢m.cekiera,它的伟大工程 –

+0

我要重新设计我的第三个查询条件是否会有两个纪录,状态= 1,那么它应该在比较中,挑选具有最低金额场 –

+0

@LalitJadiya最低纪录?有状态= 1的meny记录,你的意思是,status = 1的重复记录,还是status = 1的所有记录中的一个? –