2016-06-29 3 views
-2

У меня проблема с объединением двух таблиц, чтобы вернуть только один столбец из другого.Внутреннее соединение возвращает слишком много строк.

SELECT om.*, cm.Sales_Stage FROM dbo.OM_Table1 om JOIN dbo.Criteria_Matters cm ON cm.clientCorporationID = om.ClientCorporationID ORDER BY om.ClientCorporationID

Я хочу, чтобы включить Sales_Stage из моей CM таблицы, но инф причина результирующего набора для возврата 14k + строк вместо этого ~ 7k, который возвращается без соединения.

Есть ли какой-либо момент, чтобы просто добавить этот дополнительный столбец, не взорвав запрос?

+2

Я имею в виду, что это означает, что таблица 'dbo.Criteria_Matters' имеет более одной строки на' clientCorporationID'. – Lamak

+1

Помогите нам помочь - делитесь структурами таблиц, некоторыми примерами данных и результатом, который вы хотите получить для этого образца. – Mureinik

+0

Ваша проблема в том, что вы тянете om. * ..... – logixologist

ответ

1

Вы можете использовать подзапрос ... обратите внимание, что это может неправильно выбрать нужный sales_stage, поскольку у вас есть несколько записей в Criteria_Matters за ClientCorporationID. Вероятно, вам нужен заказ в подзапросе.

SELECT om.*, 
    (SELECT TOP 1 cm.Sales_Stage 
    FROM dbo.Criteria_Matters cm 
    WHERE cm.clientCorporationID = om.ClientCorporationID) AS Sales_Stage 
ORDER BY om.ClientCorporationID 

... Я предполагаю, что в om.* просто для примера. как правило, наилучшей практикой НЕ делать это в производстве.

Если вы хотели увидеть разницу вы можете захотеть сделать что-то вроде этого вместо ...

SELECT om.*, cm.Sales_Stage, cm.Criteria_MatterID 
FROM dbo.OM_Table1 om 
JOIN dbo.Criteria_Matters cm ON cm.clientCorporationID = om.ClientCorporationID 
ORDER BY om.ClientCorporationID 
+0

Действительно, вы правы, что «это может неправильно выбрать sales_stage [OP] want [s]». Фактически, как написано, нет никакого способа быть уверенным в том, что он даст желаемые результаты, если дополнительные строки не будут обманывать (в этом случае «SELECT DISTINCT» может быть лучшим выбором). Таким образом, непонятно, почему вы представляете его в качестве ответа. –

+0

Согласен ... но это все равно расширит его список, который, по-видимому, не является его намерением по поводу поставленного вопроса. Хотя реальный ответ может заключаться в том, чтобы добавить PK из «Criteria_Matters» –

+0

«SELECT distinct» был ошибкой копирования и вставки ... Я удалил 'distinct' –

0

Просто угадать, так как нет никакой информации о структуре таблиц, но проблема в том, что, вероятно, таблица Criteria_Matters имеет много записей для данного идентификатора clientCorporationID. Таким образом, он будет дублировать каждую запись в OM_Table1 на основе количества соответствующих записей Criteria_Matters.ClientCorporationID.

Есть несколько способов справиться с этим - одним из способов было бы использовать встроенный просмотр вместо того, чтобы входить в полную таблицу Criteria_Matters.

Если вы добавили встроенный просмотр и GROUP BY Criteria_Matters.ClientCorporationID - вам гарантировано, что в объединенной таблице будет только одна запись на ClientCorporationID, и вы не получите дублированные записи. Конечно, поскольку вы группируетесь по clientCorporationID, вам необходимо применить некоторую агрегированную функцию к Sales_Stage. Если вы просто выберите MAX (Sales_Stage), вы получите максимальное значение. Если вы знаете, что Sales_Stage одинаково для каждого данного клиентаCorporationID - вы все настроены. SQL будет выглядеть следующим образом:

SELECT om.*, cm.Sales_Stage 
FROM dbo.OM_Table1 om 
INNER JOIN 
(
    SELECT clientCorporationID, MAX(Sales_Stage) AS Sales_Stage 
    FROM dbo.Criteria_Matters 
    GROUP BY clientCorporationID 
) cm ON cm.clientCorporationID = om.ClientCorporationID 
ORDER BY om.ClientCorporationID 

Однако, если существуют различные значения Sales_Stage для данного clientCorporationID в таблице Criteria_Matters - вы можете группировать обоими clientCorporationID и Sales_Stage. Когда вы это сделаете, вы теперь будете дублировать записи OM_Table1, но только для каждого уникального Sales_Stage, соответствующего идентификатору ClientCorporationID в Criteria_Matters. SQL будет выглядеть так:

SELECT om.*, cm.Sales_Stage 
FROM dbo.OM_Table1 om 
INNER JOIN 
(
    SELECT clientCorporationID, Sales_Stage 
    FROM dbo.Criteria_Matters 
    GROUP BY clientCorporationID, Sales_Stage 
) cm ON cm.clientCorporationID = om.ClientCorporationID 
ORDER BY om.ClientCorporationID 

Удачи вам!

Смежные вопросы