首页 > 解决方案 > Joining two table with condition

问题描述

I have two tables.

  1. parent table: contains pid, pname and gender columns
  2. 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

标签: sql-server

解决方案


您遇到的问题之一是每个父关系都有一个单独的行。如果您想将其组合成一行(每个父级有单独的列),您将不得不使用聚合。

正如@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,但语法大致相同。


推荐阅读