Соединение двух таблиц с условием - PullRequest
0 голосов
/ 26 марта 2019

У меня есть две таблицы.

  1. родительская таблица : содержит столбцы pid, pname и пола
  2. дочерняя таблица : child_parent таблица содержит childidи родительский идентификатор

Мне нужно указать окончательный вывод:

childid, parentid, fathername, mothername (based on gender value)

Я новичок в SQL.

Я написал запрос ниже, но я неполучение ожидаемых результатов:

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

Ответы [ 2 ]

2 голосов
/ 26 марта 2019

Одна из ваших проблем заключается в том, что у вас есть отдельная строка для каждого родительского отношения. Если вы хотите объединить это в одну строку (с отдельными столбцами для каждого родителя), вам придется использовать агрегацию.

Как отметил @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 отцами (или более, в случае многоженства)? Кроме того, в домохозяйствах с одним родителем вам нужно будет обрабатывать случаи, когда один из столбцов будет нулевым.

Кроме того, в зависимости от того, что вы моделируете, вам может потребоваться рассмотреть случаи, когда пол родителя не является ни «М», ни «F».

У меня есть скрипка здесь . Это Postgres, но синтаксис примерно такой же.

1 голос
/ 26 марта 2019

Вы можете написать условное объединение, используя дополнительные условия, как указано ниже:

 select cc.cpid,p.pid, f.pname as father_name, m.pname as mother_name    
        from child_parent AS cc 
        join parent AS f on cc.pid=f.pid and gender = 'M'
        join parent AS m on cc.pid=m.pid and gender = 'F'             
        order by cc.cpid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...