Как заменить предложение IN на JOIN? - PullRequest
0 голосов
/ 13 июня 2018
select [CLIENT_SUIT_ID]
  ,[CLIENT_CODE]
  ,[CARD_ID]
  ,[EXPIRE_DATE]
  ,ROW_NUMBER()over(partition by CARD_ID order by CARD_ID ASC)
from [KSS_TMP].[dbo].[CLIENT_SUIT]
where CARD_ID in(
SELECT CARD_ID
    from [KSS_TMP].[dbo].[CLIENT_SUIT]
    where CLIENT_CODE NOT LIKE '080%' AND card_id != '-'
    GROUP BY CARD_ID
    HAVING COUNT(CARD_ID) > 1
    )

Можете ли вы сказать мне, как заменить предложение IN на JOIN. Я пытался сохранить свои условия, поэтому я должен использовать IN.

1 Ответ

0 голосов
/ 13 июня 2018

Если вы хотите заменить предложение in на join:

select [CLIENT_SUIT_ID]
  ,[CLIENT_CODE]
  ,[CARD_ID]
  ,[EXPIRE_DATE]
  ,ROW_NUMBER()over(partition by CARD_ID order by CARD_ID ASC)
from [KSS_TMP].[dbo].[CLIENT_SUIT] as Tab1 JOIN 
    (SELECT CARD_ID FROM [KSS_TMP].[dbo].[CLIENT_SUIT] 
     where CLIENT_CODE NOT LIKE '080%' AND card_id != '-' 
     GROUP BY CARD_ID 
     HAVING COUNT(CARD_ID) > 1 ) as Tab2 ON Tab1.Card_Id = Tab2.Card_Id

В вашем случае вам не нужен дополнительный подзапрос.Вы можете сделать все это в одном запросе, используя другую оконную функцию с conditional aggregation:

select * from (
  select *,
    row_number() over (partition by card_id order by card_id) rn,
    count(case when client_code not like '080%' and card_id != '-' 
               then 1 end) over (partition by card_id) cnt
  from client_suit
  ) t
where t.cnt > 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...