yegnele46 Ответов: 1

Ошибочные результаты из-присоединяйтесь


I'm using the Adventureworks 2014 database and am trying to achieve an output that displays sales on the bike product category by region

I've created an inner join using 4 tables to achieve this but when I execute it it just looks as thought the figures are copied, it doesn't look like they're influencing each other
e.g the sales YTD column is exactly the same for all of the rows 

Below is the code I used

<pre>select p.[ProductSubcategoryID],s.[TerritoryID],d.[ProductID], r.[CountryRegionCode], r.SalesYTD, r.SalesLastYear
from [Sales].[SalesOrderDetail] as d, [Sales].[SalesOrderHeader] as s, [Production].[Product] as p, [Sales].[SalesTerritory] as r
INNER JOIN [Production].[Product] ON [ProductID] = [ProductID]
INNER JOIN [Sales].[SalesOrderHeader] ON [SalesOrderID] = [SalesOrderID]


Что я уже пробовал:

select p.[ProductSubcategoryID],s.[TerritoryID],d.[ProductID], r.[CountryRegionCode], r.SalesYTD, r.SalesLastYear
from [Sales].[SalesOrderDetail] as d, [Sales].[SalesOrderHeader] as s, [Production].[Product] as p, [Sales].[SalesTerritory] as r
INNER JOIN [Production].[Product] ON [ProductID] = [ProductID]
INNER JOIN [Sales].[SalesOrderHeader] ON [SalesOrderID] = [SalesOrderID]

1 Ответов

Рейтинг:
12

MadMyche

Когда вы используете запятая нотация для выполнения внутреннего соединения необходимо квалифицировать связь между Соединенными таблицами в предложении WHERE. У вас их нет, так что отношения действительно могут стать нефильтрованными, как вы видите.

Внутренние соединения, которые вы добавили, не являются таковыми псевдоним то же самое, так что они просто действуют как дополнительные соединения.
И без того, чтобы термины соединения были квалифицированы с именем таблицы или псевдонимом.. они довольно неоднозначны, и вы делаете поиск в БД отношения FK<==>PK, чтобы собрать их вместе.

Попробуйте это сделать, используя стандартные внутренние соединения с квалифицированными определениями

SELECT p.ProductSubcategoryID
     , s.TerritoryID
     , d.ProductID
     , r.CountryRegionCode
     , r.SalesYTD
     , r.SalesLastYear
FROM Sales.SalesOrderDetail       d
INNER JOIN Sales.SalesOrderHeader s ON d.SalesOrderID = s.SalesOrderID
INNER JOIN Production.Product     p ON d.ProducID     = p.ProductID
INNER JOIN Sales.SalesTerritory   r ON s.TerritoryID  = r.TerritoryID
Было бы также полезно рассказать нам, что именно вы ищете в запросе... Я не знаю БД AdventureWorks, но, взглянув на ее схему и ваш запрос, я могу понять, почему вы получаете много значений, которые кажутся дубликатами.
Возможно, вы захотите добавить предложение WHERE, чтобы ограничить возврат чем-то, что будет показывать (намного) меньше результатов для ясности