Объедините 3 таблицы с несколькими значениями в других таблицах - PullRequest
0 голосов
/ 08 мая 2020

У меня 3 стола. нужно присоединиться к ним таким образом, чтобы я получил ResultTbl

ProductMaster

PID Name   Cost
1   Car    1000
2   Bike   500

ImageMaster

ImgId PID ImageName
1      1   car1.png
2      1   car2.png
3      1   car3.png
4      2   Bike1.png
5      2   Bike2.png

BidingMaster

ImgId PID BidCost  userid
1      1   2000     1
2      1   2500     2
3      1   3000     1
4      2   1200     1
5      2   900      2

UserMaster

 UserId Username Usertype
   1      Test 1    1
   2      Test 2    2

Usertype

Usertypeid usertypename
1              admin
2              regularuser

Мне нужно объединить их таким образом, чтобы я получил максимальную стоимость продукта и 1-ю строку от Imagemaster.

ResultTbl

PID  Name  Cost  ImgName     username usertype
1    Car   3000   Car1.png    Test 1    admin
2    Bike  1200   bike1.png   Test 2    regularuser

Если кто-то еще не сделал ставку, будет отображаться стоимость продукта, но если кто-то сделал ставку, будет отображаться максимальная ставка. Это снова будет объединено с еще двумя таблицами, чтобы получить его имя пользователя и тип пользователя (простые таблицы). Я работал над кодом SQL, но он по-прежнему не дает результата.

Это то, что я пробовал ..

SELECT a.PID ,a.Name, b.maxAmount, d.Img
FROM ProductMaster AS a
LEFT OUTER JOIN (
    SELECT PID, MAX(Amount) AS maxAmount
    FROM BidMaster
    GROUP BY PID
) AS b ON a.PID = b.PID
FULL OUTER JOIN (
    SELECT PID, ImageName AS Img, MAX(ProductId) AS macImg
    FROM ImageMaster
    GROUP BY PID, ImageName
) AS d ON a.PID = d.PID

Ответы [ 3 ]

2 голосов
/ 08 мая 2020

Таким образом, вы можете использовать подзапрос для получения ImageName, и вам нужна оконная функция для получения соответствующей строки BidingMaster, после чего вы можете присоединиться как обычно.

select P.PID as PID
  , P.[Name] as [Name]
  , coalesce(BM.BidCost, P.Cost) as Cost
  , (select top 1 I.ImageName from dbo.ImageMaster I where I.PID = P.PID order by I.ImgID asc) as ImgName
  , UM.UserName
  , UT.UserTypeName
from dbo.ProductMaster P
left join (
  select PID, ImgID, BidCost, UserId
  from (
    select PID, ImgID, BidCost, UserId
      , row_number() over(partition by PID order by BidCost desc) RowNumber
    from dbo.BidingMaster
  ) BM
  where RowNumber = 1
) BM on BM.PID = P.PID
left join dbo.UserMaster UM on UM.UserId = BM.UserId
left join dbo.UserType UT on UT.UserTypeId = UM.UserType;
1 голос
/ 08 мая 2020

Вы можете использовать подзапросы, чтобы получить максимум главной таблицы назначения ставок и 1-й строки от imagemaster перед присоединением

select p.*, a.cost, i.imgname 
from (select pid, max(bidcost) cost from bidingmaster group by pid) a
join (select pid, min(imgid) imgid from imagemaster group by pid) b on b.pid = a.pid
join imagemaster i on i.imgid = b.imgid
join ProductMaster p on p.pid = a.pid
0 голосов
/ 08 мая 2020

Вы можете попробовать с оконной функцией row_number().

select 
    PID,
    Name,
    BidCost,
    ImageName
from
(
    select
        bm.PID,
        Name,
        BidCost,
        ImageName,
        row_number() over (partition by bm.PID order by BidCost desc) as rnk
    from BidingMaster bm

    join ImageMaster im
    on bm.PID = im.PID
    anb bm.ImgID = im.ImgId

    join ProductMaster pm
    on bm.PID = pm.PID

) val
where rnk = 1

order by
    PID
...