Лучший подход к запросу SQL Server с использованием различных - PullRequest
0 голосов
/ 09 января 2009

У меня есть две таблицы: TableA и TableB, объединенные TableA.TableA_Id-> 1..n <-TableB.TableA_Id. Простой ПК-ФК. </p>

Мне нужно извлечь различных записей TableA с заданным условием для TableB. Вот мой первый подход:

ВЫБРАТЬ * ИЗ ТАБЛИЦЫ A ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица B ВКЛ. A.idA = B.IdA И B.Date = '2009-01-10' ЗАКАЗАТЬ A.Id;

Это хорошо, но это не дает мне "отчетливых" записей. Некоторые записи в таблице B могут дублироваться, и, следовательно, я могу получить одни и те же записи более одного раза.

Поэтому я решил выполнить отбор (производительность не является проблемой, учитывая, что отбор, скорее всего, закончится максимум 20/30 записями):

SELECT * FROM TableA, ГДЕ TableA.Id IN (ВЫБЕРИТЕ РАЗЛИЧНЫЙ IdA ОТ TableB, ГДЕ Date = '20090110') ЗАКАЗАТЬ ПО TableA.IdA;

Это отлично работает.

Теперь вопрос: как я могу использовать Inner Join и все же получить различные значения? Возможно ли это за один проход или вложенный запрос является обязательным? Чего мне не хватает?

Ответы [ 4 ]

2 голосов
/ 09 января 2009

Я думаю, что нормальное утверждение о существовании - это то, что вам нужно:

SELECT * 
FROM TableA A 
WHERE Exists( select B.IdA from TableB B where A.IdA = B.IdA and B.Date = '2009-01-10' )
ORDER BY A.Id;

По производительности это должен быть лучший подход.

Если вам нужны значения из другой таблицы, и чтобы избежать использования различных, вы можете присоединиться к подзапросу, сгруппированному так:

Select TableA.*, groupedTableB.OtherData 
From TableA
Inner join 
(
    select TableB.IdA, Sum(TableB.Data) SummaryData
    from TableB where TableB.Date = '2009-01-10'
    group by TableB.IdA

) groupedTableB on groupedTableB.IdA = TableA.IdA
2 голосов
/ 09 января 2009

использовать производную таблицу

SELECT * FROM TableA 
JOIN
(SELECT DISTINCT IdA FROM TableB WHERE Date = '20090110') a
ON a.IDA = TAbleA.IDA
ORDER BY TableA.IdA
1 голос
/ 09 января 2009

И проблема с использованием

SELECT DISTINCT * FROM TableA A INNER JOIN TableB B ON A.idA = B.IdA 
AND B.Date = '2009-01-10' ORDER BY A.Id;

есть

Если он возвращает повторяющиеся значения idA, это потому, что вы выбираете слишком много столбцов, если вы не можете уменьшить то, что выбираете, вам нужен подзапрос.

0 голосов
/ 09 января 2009

Как насчет этого:

<code>select * from TableA a 
  where a.TableA_Id in
(select TableA_Id from TableB where [Date] = '2009-01-10')
order by a.TableA_Id

Вы можете добавить отличные к подзапросу, если хотите, я не уверен, улучшит ли это или уменьшит предварительную производительность.

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