我的下表有重复的家庭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
现在在进一步操作上有些卡住了。
答案 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