t-sql запрос, чтобы получить все строки из Table_A, у которых есть хотя бы один соответствующий relatedid в Table_B - PullRequest
1 голос
/ 28 августа 2010

На основе приведенных ниже таблиц

Table_A

Id  RelatedId
---------------
1   1
1   2
1   3
2   4
2   5
2   2
3   7
3   8
4   9

Table_B

RelatedId  Name
--------------
2          A
3          B

Я хочу получить все строки из Table_A, у которых есть хотя бы один соответствующий relatedid в Table_B.Идентификаторы из Table_A, у которых нет совпадений в Table_B, будут иметь одну строку в таблице результатов.

Таким образом, вывод (таблица результатов) в этом случае будет

Id  RelatedId
---------------
1   1
1   2
1   3
2   4
2   5
2   2
3   Null
4   Null

РЕДАКТИРОВАТЬ: выглядит кактекст вопроса сбивает с толку многих.Итак, подробное объяснение:

Table_A Идентификатор 1 имеет совпадение как 2, так и 3 (связанных идентификаторов) в table_B.Таким образом, вывод будет иметь все строки для 1 из таблицы Table_A.У идентичного идентификатора 2 из Table_A есть 2 (связанных идентификатора) соответствия в table_B.Таким образом, будут выбраны все строки, соответствующие 2 из Table_A.Поскольку 3 не имеет никакого соответствующего relatedid в table_B, оно будет отображаться, но с NULL в качестве relatedid в таблице результатов.

Ответы [ 3 ]

3 голосов
/ 28 августа 2010
with validids as (
 select distinct id 
 from Table_A 
  inner join Table_B on 
   Table_A.relatedid = Table_B.relatedid
)
select 
  id,
  relatedid
from Table_A 
where id in (select id from validids)
union 
select distinct
 id, 
 null
from Table_A
where id not in (select id from validids)
2 голосов
/ 28 августа 2010

Попробуйте:

  Select Distinct Id, Related_Id
  From Table_A 
  Where Related_Id In 
      (Select Related_Id From Table_B) 
1 голос
/ 28 августа 2010

Это должно делать то, что вы хотите:

with IdsWithMatchInB(Id) as (
  select distinct
    Id
  from Table_A
  where Table_A.RelatedId in (
    select Table_B.RelatedId
    from Table_B
  )
)
  select
    Table_A.Id,
    CASE WHEN IdsWithMatchInB.Id IS NULL
         THEN NULL
    ELSE Table_A.RelatedId END AS RelatedId
from Table_A
left outer join IdsWithMatchInB
on IdsWithMatchInB.Id = Table_A.Id

Вот еще один вариант, который позволяет избежать DISTINCT, помещая подзапрос в выражение CASE:

select
  Id,
  case when Id in (
    select Id
    from Table_A as Acopy
    where Acopy.RelatedId in (
      select
        RelatedId 
      from Table_B
    )
  )
  then RelatedId
  else null end as RelatedId
from Table_A;

Один или другой может быть большеэффективный для ваших конкретных данных и индексов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...