2013-04-18 1 views
0

Я немного упростил этот вопрос. Так что просто бегите со столами, как они, пожалуйста.SQL Group by Child Table с условиями

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

Родитель столбцы таблицы

ParentId,Parent_FirstName,Parent_LastName 

Детский столбцы таблицы

ChildId,Child_FirstName,Child_LastName,ParentId,Parent_FirstName,Parent_LastName 

Родитель таблица имеет один рекорд

1,Joe,Bloggs 

Детский Стол имеет й РЗЭ запись

1,Bob,Lawrence,1,, 

2,Sam,Hunt,NULL,Joe,Bloggs 

3,Sam,Hunt,1,, 

Я хочу, чтобы иметь возможность получить следующий с помощью запроса

Joe Bloggs Bob Lawrence 
Joe Bloggs Sam Hunt 

но .. я хочу, чтобы иметь возможность связать родительскую и дочернюю таблицу по следующему

1)If there is a parentid on the child table then link using the parentid 
2)Else compare the parent_first and parent_lastname in the child table with that of the child tables 

заранее спасибо

ответ

0

Как это:

SELECT 
    p.Parent_FirstName, 
    p.Parent_LastName, 
    c.Child_FirstName, 
    c.Child_LastName 
FROM parent AS p 
INNER JOIN child AS c ON p.ParentId = c.ParentId; 

в действии здесь:

Это даст вам:

| PARENT_FIRSTNAME | PARENT_LASTNAME | CHILD_FIRSTNAME | CHILD_LASTNAME | 
------------------------------------------------------------------------- 
|    Joe |   Bloggs |    Bob |  Lawrence | 
|    Joe |   Bloggs |    Sam |   Hunt | 

Обратите внимание, что: Этот запрос будет JOIN две таблицы, используя простой JOIN используя первое условие, чтобы связать две таблицы:

1) Если на дочерней таблице есть родительский элемент, используйте ссылку parentid

и этого будет достаточно; это даст вам то, что вы ищете, но для второго условия, которые вы хотите связать таблицу ребенка с родительским столом с ним:

2) Else сравнить parent_first и parent_lastname в подчиненная таблица с этим из дочерних таблиц

Вы можете добавить следующее условие с OR:

c.ParentId IS NULL 
AND c.Parent_FirstName = p.Parent_FirstName 
AND c.Parent_LastName = p.Parent_LastName 

Что-то вроде этого:

SELECT 
    p.Parent_FirstName, 
    p.Parent_LastName, 
    c.Child_FirstName, 
    c.Child_LastName 
FROM parent AS p 
INNER JOIN child AS c ON p.ParentId = c.ParentId 
         OR (c.ParentId IS NULL 
          AND c.Parent_FirstName = p.Parent_FirstName 
          AND c.Parent_LastName = p.Parent_LastName) 

Это даст вам тот же результат, но с повторяющимися строками:

Как это:

| PARENT_FIRSTNAME | PARENT_LASTNAME | CHILD_FIRSTNAME | CHILD_LASTNAME | 
------------------------------------------------------------------------- 
|    Joe |   Bloggs |    Bob |  Lawrence | 
|    Joe |   Bloggs |    Sam |   Hunt | 
|    Joe |   Bloggs |    Sam |   Hunt | 

Добавить DISTINCT - SELECT, чтобы устранить повторяющиеся строки.


Отказ от ответственности:

Это при условии, что вы не ищете рекурсивный запрос.

 Смежные вопросы

  • Нет связанных вопросов^_^