Как использовать объединение в результате другого объединения с новым полем - PullRequest
1 голос
/ 16 апреля 2020

у меня есть 2 таблицы vehicle1, которые содержат информацию о различных типах транспортных средств и имеют уникальный lot_ и другой список пожеланий таблицы, в котором есть два поля lot # и идентификатор пользователя, который я пытаюсь сделать, это вернуть таблицу vehicle1 с дополнительным полем скажем flag добавил к нему значения 1 или 0, соответствующие тому, добавил ли идентификатор пользователя этот автомобиль в список желаний или нет, я использовал этот

ALTER PROCEDURE [dbo].[get_AllVehicleModified]
@user varchar(50),
@limit varchar(30)
AS
BEGIN
    SELECT ad.*
FROM ( 
SELECT *,CASE WHEN t1.lot# IN (t2.lot_) THEN 1 ELSE 0 END Flag
FROM  vehicle1 t1
FULL OUTER JOIN wishlist t2 ON t1.lot#=t2.lot_ WHERE t2.userid=@user ) ad
ORDER BY lot#
OFFSET  (@limit - 1)*10 ROWS
FETCH NEXT 10 ROWS ONLY;
END

этот запрос содержит результат с новым флагом поля, содержащим 1 и только тех транспортных средств, которые были в списке пожеланий, однако я хочу, чтобы вся таблица vehicle1 содержала 0 в оставшихся, как я могу добиться этого?

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Я рекомендую использовать EXISTS:

SELECT v.*,
       (CASE WHEN EXISTS (SELECT 1
                          FROM wishlist wl
                          WHERE v.lot# = wl.lot_ AND
                                wl.userid = @user
                         )
             THEN 1 ELSE 0
        END) as Flag
FROM vehicle1 v
ORDER BY v.lot#
OFFSET (@limit - 1)*10 ROWS
FETCH NEXT 10 ROWS ONLY;

Я думаю, что лучше захватить логи c, которые вы хотите. Я также подозреваю, что это может работать лучше с ORDER BY и FETCH.

1 голос
/ 16 апреля 2020

Я думаю, что вам нужен left join и условный лог c:

select v.*, case when w.lot# is null then 0 else 1 end flag
from vehicle v
left join whishlist w on w.userid = @user and w.lot# = v.lot_

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

...