Как я могу записать эффективный SQL-запрос, который возвращается, столбцы формируют таблицу A плюс немного столбца, который указывает, существует ли PK таблицы A в таблице B? Я использую MS SQLServer 2005.Спасибо.
Это зависит от того, является ли отношение сторонних таблиц 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).
Я предполагаю, что первичный ключ в таблице 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 * в целом, но в данном примере он служит цели.
В других ответах указывается коррелированный подзапрос; соединение (левое внешнее), вероятно, более эффективно.
Я предполагаю, что 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 )
;