Дважды соедините таблицу с двумя разными значениями для одного поля - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть запись, с которой связаны записи двух человек.Записи о людях - это продавцы (peoplecode = 20) и клиенты (peoplecode = 1).Я хочу город как продавца, так и клиента.Я думал, что это будет прямо вперед, но не могу заставить его работать - я не получаю результатов.Таблица Folderpeople просто связывает мою папку с моими людьми.

select f.folderid, f.foldername, fp.peoplecode, 
p.addrcity as clientcity, p2.addrcity as sellercity 
from folder  f
join folderpeople fp on fp.folderid = f.folderid 
join people p on fp.peopleid = p.peopleid and fp.peoplecode = 1 
join people p2 on fp.peopleid = p2.peopleid and fp.peoplecode = 20 ; 

Ответы [ 4 ]

0 голосов
/ 09 ноября 2018

Я бросил пистолет - ответ Рэнди дал результаты - но дал мне по два ряда для каждого. Но это указало мне в правильном направлении. Когда я объединил решение Рэнди с решением mdem7, я нашел решение, которое сработало.

with sellers as (select fp.folderid, p.peopleid, fp.peoplecode, p.addrcity, 
     p.addrpostal from folderpeople fp , people p where fp.peopleid = p.peopleid and 
     fp.peoplecode = 20), 
clients as 
     (select fp2.folderid, p2.peopleid, fp2.peoplecode, p2.addrcity, p2.addrprovince, 
     p2.addrpostal, p2.namelast, p2.namefirst from folderpeople fp2, people p2  where 
     fp2.peopleid = p2.peopleid and fp2.peoplecode = 1)
select c.namelast as ClientLast, c.namefirst as ClientFirst, f.issuedate, 
     c.addrcity as "Client City", s.addrcity as "Seller City"
     from folder  f
        left join sellers s on f.folderid = s.folderid  
        left join clients c on f.folderid = c.folderid; 
0 голосов
/ 08 ноября 2018

Проблема в том, что вы присоединились к таблице folderpeople только один раз, поэтому вы никогда не сможете получить никаких строк. Попробуйте это:

select f.folderid, f.foldername, fp.peoplecode, 
p.addrcity as clientcity, p2.addrcity as sellercity 
from folder  f 
join folderpeople fp1 on fp1.folderid = f.folderid 
join people p on fp1.peopleid = p.peopleid and fp1.peoplecode = 1 
join folderpeople fp2 on fp2.folderid = f.folderid 
join people p2 on fp2.peopleid = p2.peopleid and fp2.peoplecode = 20

Кроме того, я бы использовал внешние объединения на тот случай, если у вас нет ни продавца, ни клиента для каждой папки.

0 голосов
/ 08 ноября 2018

Я подозреваю, что вам просто нужно left join s:

select f.folderid, f.foldername, fp.peoplecode, 
       p.addrcity as clientcity, p2.addrcity as sellercity 
from folder f join
     folderpeople fp 
     on fp.folderid = f.folderid left join
     people p
     on fp.peopleid = p.peopleid and
        fp.peoplecode = 1 left join
     people p2
     on fp.peopleid = p2.peopleid and fp.peoplecode = 20 ; 

Вы не получите строк, потому что fp.peoplecode не может быть одновременно "1" и "20" в одной строке.

Это должно решить проблему отсутствия строк. Возможно, это не та структура набора результатов, которую вы хотите. Если это не так, задайте другой вопрос с соответствующими данными выборки и желаемыми результатами.

0 голосов
/ 08 ноября 2018

Попробуйте, дайте мне знать, если это работает.

with sellers as
  (select peopleid, addrcity from people where peoplecode = 20),
clients as 
  (select peopleid, addrcity from people where peoplecode = 1)
select f.folderid, f.foldername, fp.peoplecode, 
       c.addrcity as clientcity, s.addrcity as sellercity 
 from folder  f
 join folderpeople fp on fp.folderid = f.folderid 
 join sellers s on fp.peopleid = s.peopleid 
 join clients c on fp.peopleid = c.peopleid; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...