Получение отличных строк от левого внешнего объединения

Точечный продукт должен быть выполнен следующим образом

import numpy as np

R = np.array([Rx,Ry,Rz])
K = np.array([Kx,Ky,Kz])
value = np.dot(R,K)
20
задан Nazgul 25 April 2009 в 13:58
поделиться

5 ответов

Вы должны включить предложение активности в ваше объединение (и не нужно различать):

select Table1.Id as Id, Table1.Name, Table2.Description from Table1
left outer join Table1Table2Map on (Table1Table2Map.Table1Id = Table1.Id) and Table1Table2Map.IsActive = 1
left outer join Table2 on (Table2.Id = Table1Table2Map.Table2Id)
2
ответ дан 29 November 2019 в 23:17
поделиться

Попробуйте:

left outer join (select distinct YOUR_COLUMNS_HERE ...) SUBQUERY_ALIAS on ...

Другими словами, не объединяйтесь непосредственно с таблицей, объединяйтесь с подзапросом, ограничивающим строки, с которыми вы соединяетесь.

25
ответ дан 29 November 2019 в 23:17
поделиться

Если вы хотите отобразить несколько строк из таблицы2, у вас будут отображаться повторяющиеся данные из таблицы1. Если вы хотите, чтобы вы могли использовать агрегатную функцию (IE Max, Min) для table2, это исключило бы повторяющиеся строки из table1, но также скрыло бы некоторые данные из table2.

См. Также мой ответ на вопрос # 70161 для дополнительного объяснения

1
ответ дан 29 November 2019 в 23:17
поделиться

Чтобы уточнить один момент: вы сказали, что в Таблице 2 имеется только одна «активная» строка на строку в Таблице1. Разве эта строка не помечена как активная, чтобы вы могли поместить ее в предложение where? Или есть какое-то волшебство в динамических условиях, предоставляемых пользователем, которые определяют, что активно, а что нет.

Если вам не нужно ничего выбирать из Таблицы 2, решение относительно простое: вы можете использовать функцию EXISTS. но так как вы поместили TAble2.Description в предложение, я предполагаю, что это не так.

В основном, что отличает соответствующие строки в Table2 от не относящихся к делу? Это активный флаг или динамическое условие? Первый ряд? Это действительно то, как вы должны удалять дубликаты.

Предложения DISTINCT, как правило, используются слишком часто .

3
ответ дан 29 November 2019 в 23:17
поделиться

You can re-write your left joins to be outer applies, so that you can use a top 1 and an order by as follows:

select Table1.Id as Id, Table1.Name, Table2.Description 
from Table1
outer apply (
   select top 1 *
   from Table1Table2Map
   where (Table1Table2Map.Table1Id = Table1.Id) and Table1Table2Map.IsActive = 1
   order by somethingCol 
) t1t2
outer apply (
   select top 1 *
   from Table2
   where (Table2.Id = Table1Table2Map.Table2Id)
) t2;

Note that an outer apply without a "top" or an "order by" is exactly equivalent to a left outer join, it just gives you a little more control. (cross apply is equivalent to an inner join).

You can also do something similar using the row_number() function:

 select * from (
      select distinct Table1.Id as Id, Table1.Name, Table2.Description,
        rowNum = row_number() over ( partition by table1.id order by something )
      from Table1
      left outer join Table1Table2Map on (Table1Table2Map.Table1Id = Table1.Id)
      left outer join Table2 on (Table2.Id = Table1Table2Map.Table2Id)
 ) x
 where rowNum = 1;

Most of this doesn't apply if the IsActive flag can narrow down your other tables to one row, but they might come in useful for you.

7
ответ дан 29 November 2019 в 23:17
поделиться
Другие вопросы по тегам:

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