SQL Server: self join - извлекает записи, соответствующие предложению where, а также когда нет записей в таблице псевдонимов - PullRequest
1 голос
/ 08 мая 2019

У меня есть таблица, как показано ниже:

enter image description here

Запрос:

select t1.* 
from TABLE2 as t1 
left join TABLE2 as t2 on t1.itemcode = t2.itemcode 
                       and t1.warehouseid = '576' 
                       and t1.flag = 'Y' 
                       and t2.warehouseid = '276' 
                       and t2.flag = 'Y';

У меня есть вышеуказанный запрос, и я понимаю этоне идеален.

Для кода товара, если эти условия выполнены (t1.warehouseid = '576' и t1.flag = 'Y' и t2.warehouseid = '276' и t2.flag = 'Y') Я хочу получить это из t1.

Кроме того, если в t2 нет записи для кода товара (например, 456 недоступен для warehouseid 276), я также хочу получить его из t1.

Ожидается следующий вывод,

 123        576     Y
 456        576     Y 

Какой правильный запрос для этого?

Редактировать: Чтобы сделать сообщение более понятным,

Warehouse id 576 является основным элементом.

Для кода товара, присутствующего в обоих идентификаторах склада (576, 276) с одинаковыми флагами ('Y'), я хочу получить.

И если код товара отсутствует на другом складе (276), то я также хочу получить

Для кода товара, присутствующего в обоих идентификаторах склада (576, 276) с разными флагами («Y», «N»), я этого не хочу.

Ответы [ 3 ]

1 голос
/ 08 мая 2019

интерпретировать непосредственно из ваших 2 условий в WHERE пункте

select  *
from    TABLE2  t
where   warehouseid = 576
and (
        exists   -- condition 1
        (
            select  *
            from    TABLE2 x
            where   x.itemcode  = t.itemcode
            and x.warehouseid   = 276
            and x.flag      = 'Y'
        )
    or  not exists -- condition 2
        (
            select  *
            from    TABLE2 x
            where   x.itemcode  = t.itemcode
            and x.warehouseid   = 276
        )
    )
0 голосов
/ 08 мая 2019

Существует другой подход, использующий row_number ()

    with cte as
    (select t1.*,
    row_number() over(partition by itemcode order by warehouseid desc
                     ) rn
                from TABLE2 t1
    where not exists ( select 1 from TABLE2 t2 where t1.itemcode=t2.itemcode
                                                    and t2.flag='N'
                     ) and t1.warehouseid=576
   ) select * from cte where rn=1
0 голосов
/ 08 мая 2019

Надеюсь, это сработает для вас

    select t1.* from TABLE2 as t1 
     left join TABLE2 as t2 
     on t1.itemcode=t2.itemcode and t2.warehouseid='276' and t2.flag='Y';
where
     t1.warehouseid='576' and t1.flag='Y' 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...