sql-server - Joining two table with condition
问题描述
I have two tables.
- parent table: contains pid, pname and gender columns
- child table : child_parent table contains childid and parent id
I need final out put as:
childid, parentid, fathername, mothername (based on gender value)
I am new to SQL.
I have written below query, but I am not getting the expected results:
select
cc.cpid, p.pid, p.pname,
case p.gender
when 'M' then 'father'
when 'F' then 'Mother'
end as Parenttype
from
parent p
join
child_parent cc on (cc.pid = p.pid)
order by
cc.cpid
解决方案
您遇到的问题之一是每个父关系都有一个单独的行。如果您想将其组合成一行(每个父级有单独的列),您将不得不使用聚合。
正如@Venkataraman_R 指出的那样,您可以将Child
桌子加入您的Parent
桌子两次(一次用于父亲,一次用于母亲)。然后您可以使用聚合函数将行“折叠”为 1:
SELECT
child_parent.cid,
father_id = MIN(Father.pid),
father_name = MIN(Father.pname),
mother_id = MIN(Mother.pid),
mother_name = MIN(Mother.pname)
FROM child_parent
LEFT JOIN parent AS Father ON
Father.pid = child_parent.pid
AND Father.gender = 'M'
LEFT JOIN parent as Mother ON
Mother.pid = child_parent.pid
AND Mother.gender = 'F'
GROUP BY child_parent.cid
请注意我每次如何为父表赋予有意义的别名,就像@Venkataraman_R 一样。
使用聚合函数,您现在有一行:
+-----+-----------+-------------+-----------+-------------+
| cid | father_id | father_name | mother_id | mother_name |
+-----+-----------+-------------+-----------+-------------+
| 1 | 2 | Jack | 3 | Josephine |
+-----+-----------+-------------+-----------+-------------+
现在,提醒一句:这个查询假设每个孩子最多有一个父亲,最多有一个母亲。有 2 个母亲或 2 个父亲(或更多,如果是一夫多妻制)的孩子呢?此外,对于单亲家庭,您需要处理其中一列为空的情况。
此外,根据您要建模的内容,您可能需要考虑父母的性别既不是“M”也不是“F”的情况。
我这里有一把小提琴。它是 Postgres,但语法大致相同。
推荐阅读
- xaml - Stacklayout 背景与 MVVM 的颜色绑定
- ios - 使用文本字段输入 SwiftUI 读取和计算
- java - 无法使用数组列表填充微调器?
- mongodb - 如何在MongoDB中检查哪个查询经常运行非常频繁
- django - Django,如何验证依赖于另一个类外键的年份
- python - Pandas 中的多个字符串条件
- python - 在 Kubernetes 中容器化 Flask 微服务
- haskell - 在 Haskell 中编写一个返回名称列表的函数?
- eclipse - Eclipse Launch Group - 启动模式如何工作?
- javascript - JQuery div clone changes ids but javascript slider function not refreshing