Я должен использовать ключевое слово СОЕДИНЕНИЯ sql для сложных соединений на нескольких таблицах?

Существует перегрузка расширения Select, которое также предоставляет индекс ( MSDN )

var combine = dict1.Union(dict2)
    .GroupBy(kvp => kvp.Key)
    .Select((grp,index) => new { Key = grp.Key, Value = new Test { Number = index+1, Name = grp.First().Name}})
    .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

9
задан Brann 10 March 2009 в 16:01
поделиться

4 ответа

Это - вопрос вкуса, но мне нравится ключевое слово СОЕДИНЕНИЯ лучше. Это делает логику более ясной и более согласовывается с ЛЕВЫМ синтаксисом ВНЕШНЕГО ОБЪЕДИНЕНИЯ, который идет с ним. Обратите внимание, что можно также использовать ВНУТРЕННЕЕ ОБЪЕДИНЕНИЕ, которое синонимично с СОЕДИНЕНИЕМ.

Синтаксис

   a JOIN b
    ON expression relating b to all of the tables before

b может быть самим соединением. Для внутренних объединений это не имеет значения, но для внешнего можно управлять порядком соединений как это:

select * from
   a left join
      d join c
      on d.i = c.i
   on a.k = d.k 

Здесь лево-присоединенного к внутреннему объединению между d и c.

Вот Ваш запрос:

select * 
    from tbA A
    join tbB B on A.ID = B.ID
    join tbC C on B.ID2 = C.ID2
    join tbD D on A.ID = D.ID and C.ID3 = D.ID3 and B.ID4 = D.ID4
where 
    A.Foo='Foo'
12
ответ дан 4 December 2019 в 10:05
поделиться
SELECT * 
FROM tba AS a
    JOIN tbb AS b ON a.id = b.id
    JOIN tbc AS c ON b.id2 = c.id2
    JOIN tbd AS d ON a.id = d.id AND c.id3 = d.id3 AND b.id4 = d.id4
WHERE 
    a.foo = 'Foo'

Хотя мне нелегко воображать любую потребность в этом. Пустой для предоставления примера или а более описательных имен таблиц?

2
ответ дан 4 December 2019 в 10:05
поделиться

JOIN синтаксис является более четким (хотя я лично предпочитаю WHERE синтаксис в простых случаях), и, то, которое более важно, может обработать INNER и OUTER участвует в более ясном пути.

WHERE не удерживается от использования и вероятно никогда не будет.

Это удержало от использования только в некотором смысле настолько отличающийся OUTER JOIN обходные решения (как (*) и (+)) удерживаются от использования.

Нет ничего, с чем Вы не можете сделать JOIN то, что можно сделать с WHERE, но не наоборот.

2
ответ дан 4 December 2019 в 10:05
поделиться

Я нахожу синтаксис соединения намного легче понять

select *
from tbA A
inner join tbB B on a.id = b.id
inner join tbC C on b.id2 = c.id2
inner join tbD D on a.id = d.id and c.id3 = d.id3 and b.id4 = d.id4
where A.Foo='Foo'

Теперь можно ясно видеть, как объединены данные и что это не очень сложное соединение в целом.

BTW, проектирование баз данных в Вашем примере сильно пахнет недостающей нормализацией. Обычно у Вас должна быть любая одна таблица, соединяющая со многими (соединение b на a.bid = b.bid присоединяются к c на a.cid = c.cid), или цепочка (соединение b на a.bid = b.bid присоединяются к c на b.cid = c.cid).

Править. Добавленное дополнительное ключевое слово, ВНУТРЕННЕЕ, который не изменяет результат, но делает его более ясным.

5
ответ дан 4 December 2019 в 10:05
поделиться
Другие вопросы по тегам:

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