在MySQL中使用正确的数据查找和替换重复项

时间:2019-08-05 07:24:09

标签: mysql sql

我的下表有重复的家庭ID,但家庭成员的数量却不同:

tbl_family

+------------+--------------+---------+
| familyID   | Members      | Location|
+------------+--------------+---------+
|      100   | 3            |    xyz  |
|      100   | 4            |    xyz  |
|      101   | 1            |    abc  |
|      101   | 2            |    abc  |
|      102   | 5            |    efg  |
|      103   |              |    hij  |
+------------+--------------+---------+

我还有第二张表,我们在其中验证了重复的家庭成员的正确计数

tbl_verifier

+------------+--------------+---------+
| familyID   | Members      | Location|
+------------+--------------+---------+
|      100   | 3            |    xyz  |
|      101   | 2            |    abc  |
+------------+--------------+---------+

我想在mysql中创建一个视图,该视图将显示没有重复的族,并使用已验证的族成员数维护该行。结果应如下所示:

tbl_results
+------------+--------------+---------+
| familyID   | Members      | Location|
+------------+--------------+---------+
|      100   | 3            |    xyz  |
|      101   | 2            |    abc  |
|      102   | 5            |    efg  |
|      103   |              |    hij  |
+------------+--------------+---------+

我将问题分为几个步骤。我要先选择所有具有匹配成员的成员,然后选择具有空成员的成员

/* Step 1: Select only those that are matching family members count in 
verifier and family */

select *
from tbl_family f
inner join
tbl_verifier v
ON f.familyID = v.familyID
WHERE f.Members = v.Members;

/* Step 2 : Select only those that have null  number of rooms*/

select *
from tbl_family f
left join
tbl_verifier v
ON f.familyID = v.familyID
WHERE f.Members is null

现在在进一步操作上有些卡住了。

5 个答案:

答案 0 :(得分:2)

使用UNION All合并两个结果集

    select *
    from tbl_family f
    inner join tbl_verifier v ON f.familyID = v.familyID
    and f.Members = v.Members 

    union all

    select * from tbl_family f
    left join tbl_verifier v ON f.familyID = v.familyID and and f.Members = v.Members
    where v.familyID is null

答案 1 :(得分:0)

听起来如何?我认为它有效

SELECT f.*
FROM tbl_family f, tbl_verifier v
WHERE (f.familyID = v.familyID AND f.Members = v.Members)
      OR f.familyID NOT IN (SELECT familyID FROM tbl_verifier)

答案 2 :(得分:0)

在您的情况下使用UNION ALL,但最好为其添加位置过滤器。

; with cte as (
    select tbl_family.family_id, tbl_family.Members, tbl_family.location
    from tbl_family 
    inner join tbl_verifier ON tbl_family.familyID = tbl_verifier.familyID
    and tbl_family.Members = tbl_verifier.Members and tbl_family.Location = tbl_verifier.Location 
    union all
    select tbl_family.family_id, tbl_family.Members, tbl_family.location
    from tbl_family 
    left join tbl_verifier ON tbl_family.familyID = tbl_verifier.familyID 
    where tbl_family.Members is null
)
Select * from cte order by family_id

答案 3 :(得分:0)

UNION ALL似乎是一个合理的解决方案。最大的问题是如果有多行,如何从第一张表中取出一行。

这是一种使用MAX()的方法:

select v.familyID, v.Members, v.Location
from tbl_verifier v
union all
select f.familyID, max(f.Members), f.Location
from tbl_family f
where not exists (select 1
                  from tbl_verifier v
                  where v.familyId = f.familyId
                 );

您的问题尚不清楚家庭是否可以位于多个地方。如果是这样,则需要在相关子句中包含location

答案 4 :(得分:0)

从上面发布的不同答案中,我能够提出以下可行的脚本

 ; with cte as (select f.familyID,
  f.Members,
  f.Location
  from tbl_family f
  inner join tbl_verifier v ON f.familyID = v.familyID
  and f.Members = v.Members 

  union all

  select f.familyID,
  f.Members,
  f.Location from tbl_family f
  left join tbl_verifier v ON f.familyID = v.familyID 
  where f.Members is NULL
)
SELECT * INTO temp1 FROM cte

SELECT * FROM tbl_family WHERE familyID NOT IN (SELECT familyID FROM temp1)
UNION ALL 
SELECT * FROM temp1
ORDER BY familyID
相关问题