SELECT
S.SiteId,
B.FeatureInstance_Id BlogId,
P.FeatureInstance_Id PortfolioId,
C.FeatureInstance_Id PagesId
FROM
Sites S
LEFT JOIN (
SiteFeatures F1
INNER JOIN Blogs B ON F1.FeatureInstanceId = B.FeatureInstance_id
) ON S.SiteID = F1.SiteID
LEFT JOIN (
SiteFeatures F2
INNER JOIN Portfolios P ON F2.FeatureInstanceId = P.FeatureInstance_id
) ON S.SiteID = F2.SiteID
LEFT JOIN (
SiteFeatures F3
LEFT JOIN PageCollections C ON F3.FeatureInstanceId = C.FeatureInstance_id
) ON S.SiteID = F3.SiteID
Это должно работать нормально, при условии, что все ваши дочерние таблицы могут иметь только одну строку для каждого FeatureInstance_Id
.
Если вы спроектировали базу данных, вы заработали хороший рэп на костяшках за то, что в таблицах были непоследовательные имена столбцов. :)
Если этот запрос работает, то вы можете рассмотреть инкапсуляцию этого в серию представлений, которые вернут запрос к приятной компактной вещи:
CREATE VIEW BlogsFeature
AS
SELECT
F.*
FROM
SiteFeatures F
WHERE EXISTS ( -- or you could do an INNER JOIN, though in theory this is correct
SELECT 1
FROM Blogs B
WHERE F.FeatureInstanceId = B.FeatureInstance_id
)
Выполнение этого для всех трех таблиц приведет к следующему запросу:
SELECT
S.SiteId,
B.FeatureInstance_Id BlogId,
P.FeatureInstance_Id PortfolioId,
C.FeatureInstance_Id PagesId
FROM
Sites S
LEFT JOIN BlogsFeature B ON S.SiteID = B.SiteID
LEFT JOIN PortfoliosFeature P ON S.SiteID = P.SiteID
LEFT JOIN PageCollections C O ON S.SiteID = C.SiteID
На самом деле, это заставило меня задуматься о другом способе выражения нужного вам запроса, хотя он все еще выглядит не очень красиво:
SELECT
S.SiteId,
F1.FeatureInstance_Id BlogId,
F2.FeatureInstance_Id PortfolioId,
F3.FeatureInstance_Id PagesId
FROM
Sites S
LEFT JOIN SiteFeatures F1
ON S.SiteID = F1.SiteID
AND EXISTS (
SELECT 1 FROM Blogs B
WHERE F1.FeatureInstanceId = B.FeatureInstance_id
)
LEFT JOIN SiteFeatures F2
ON S.SiteID = F2.SiteID
AND EXISTS (
SELECT 1 FROM Portfolios P
WHERE F2.FeatureInstanceId = P.FeatureInstance_id
)
LEFT JOIN SiteFeatures F3
ON S.SiteID = F3.SiteID
AND EXISTS (
SELECT 1 FROM PageCollections C
WHERE F3.FeatureInstanceId = C.FeatureInstance_id
)
Вы могли бы еще использовать идею Max (), если временно преобразовали свои уникальные идентификаторы в строки.
SELECT
S.SiteId,
B.FeatureInstance_Id BlogId,
P.FeatureInstance_Id PortfolioId,
C.FeatureInstance_Id PagesId
FROM
SiteFeatures F
INNER JOIN Blogs B ON