SQL-запрос, который возвращает столбцы, формирует таблицу A плюс немного столбца, который указывает, существует ли PK таблицы A в таблице B

Как я могу записать эффективный SQL-запрос, который возвращается, столбцы формируют таблицу A плюс немного столбца, который указывает, существует ли PK таблицы A в таблице B? Я использую MS SQLServer 2005.Спасибо.

1
задан dannie.f 27 November 2014 в 22:38
поделиться

3 ответа

Это зависит от того, является ли отношение сторонних таблиц 1: 1 или 1: Многие. Если 1: 1, вы можете использовать обычное соединение:

select A.*, case when b.id is null then 0 else 1 end
from A 
left join B on A.id = B.id;

Если отношение равно 1: Многие, тогда объединение умножит результат, поэтому вы должны ограничить его, и есть несколько способов. Простым способом является использование external apply и top:

select A.*, case when b.id is null then 1 else 0 end
from A
outer apply (
 select top (1) id from B where A.id = B.id) as b;

Что касается производительности, почти все предлагаемые решения будут работать одинаково, при условии наличия соответствующего индекса для B (id).

1
ответ дан 3 September 2019 в 00:23
поделиться

Я предполагаю, что первичный ключ в таблице A называется PK, а столбец в B, который будет содержать этот ключ, также называется PK.

SELECT A.*, CASE WHEN EXISTS (SELECT 1 FROM B WHERE B.PK = A.PK) THEN 1 ELSE 0 END
FROM A

Эффективность этого запроса будет зависеть от индексации в таблице B - в частности, индексируется ли столбец PK.

Мне не нравится SELECT * в целом, но в данном примере он служит цели.

0
ответ дан 3 September 2019 в 00:23
поделиться

В других ответах указывается коррелированный подзапрос; соединение (левое внешнее), вероятно, более эффективно.

Я предполагаю, что b.fk - это внешний ключ в b к pk.

select 
   a.*, 
   case when b.fk is not null then 1 else 0 end as exists_in_b
from 
   a 
   left outer join b on (a.id = b.fk ) 
;
1
ответ дан 3 September 2019 в 00:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: