2015-08-13 4 views
1

Я пытаюсь ПРИСОЕДИНИТЬ к человеку и его приятелю из таблицы Persons в SQL Server 2008, но я не знаю, как написать запрос.INNER JOIN с несколькими эксклюзивными случаями

Вот правила для выбора друзей:

  1. Если определен приятель, ваш приятель приятель
  2. Если босс определен, ваш босс ваш приятель
  3. Если ни один из них определены, ваш приятель кто кроме вас

Это Persons стол:

Persons table

Согласно вышеприведенным правилам это должно быть конечный результат:

Output table

Я пытался написать запрос, как это:

SELECT p.ID, p.Name, b.Name 
FROM persons AS p 
INNER JOIN persons AS b ON 
CASE 
    WHEN p.boss = b.id THEN 1 
    WHEN p.buddy = b.id THEN 1 
    ELSE 0 
    END = 1 

Но это не возвращают результат я ожидаю.

wrong result

PS: Если вы хотите попробовать это самостоятельно, это сценарий создания:

CREATE TABLE Persons 
    ([ID] int, [Name] varchar(4), [Boss] int, [Buddy] int) 
; 

INSERT INTO Persons 
    ([ID], [Name], [Boss], [Buddy]) 
VALUES 
    (1, 'Tom', 0, 0), 
    (2, 'Jack', 1, 0), 
    (3, 'Emil', 0, 2), 
    (4, 'Evan', 2, 3) 
; 
+0

Вы пробовали что-нибудь? –

+0

Конечно, я попробовал INNER JOIN с оператором CASE, но он не работает. –

+0

У вас возникла ошибка? Пожалуйста, опубликуйте свою попытку и что не так с результатом. –

ответ

2
select a.id, a.name, b.name 
from persons a 
inner join persons b 
on case when a.buddy <> 0 then A.buddy 
     when a.boss <> 0 then a.boss 
    else (Select min(ID) from Persons where ID <> A.ID) end = B.ID 

enter image description here

+0

Это не помешает Evan дважды появляться результаты. –

+0

Я не вижу Эвана дважды; но, может быть, я что-то упустил. Пожалуйста, дополните. – xQbert

+0

Невеста, но кажется, что поскольку для Эвана оба приятеля <> 0 И босс <> 0 истинны, то он должен быть соединен с людьми b дважды. Можете ли вы объяснить, почему этого не происходит в вашем запросе, но это произошло в попытке OP? –

0

Похоже, у вас есть иерархия, где босс имеет приоритет над приятелем:

select p.ID, p.Name, b.Name 
from persons as p 
INNER JOIN persons as b ON 
(CASE WHEN p.boss > 0 THEN p.boss 
    WHEN p.boss = 0 AND p.buddy > 0 then p.buddy 
    ELSE (select top 1 from persons p1 where p1.ID <> p.ID) 
    END) = b.ID 

Это присоединится на босса, если оба босса и приятель определяются

+0

Том не может быть его собственным приятелем, и вы пропали без вести и закончите свое дело. – xQbert

+0

не уверен, что вы можете 'select top 1' без' order by', но это сделало бы его более случайным, чтобы все, у кого не было друзей, не получалось одинаковое соответствие –