2016-12-05 3 views
2

Я хотел бы упростить свои данные с помощью таблицы MainView, но мне сложно это понять.Таблица таблиц по языку/клиенту/статусу

У меня есть таблица Fact, которая относится к клиентам, языку и статусу. Идентификатор в таблице Fact происходит из таблицы FactLink, которая имеет только столбец FactLinkID. В таблице Status имеется столбец Order, который должен отображаться в виде совокупности вместо StatusID. Моя таблица Main ссылается на таблицу Fact в нескольких столбцах.

Конечной целью будет иметь возможность запросить таблицу данных составного индекса LanguageID, StatusOrder, более просто, чем я был раньше, захватывая самый большой ClientID указанный StatusOrder и указанный ClientID или ClientID 1. Итак, что это то, что я надеялся упростить с помощью таблицы представлений.

Так,

Главная

ID | DescriptionID | DisclaimerID | Other 
----+---------------+--------------+------------- 
50 | 1    | 2   | Blah 
55 | 4    | 3   | Blah Blah 

Факт

FactID | LanguageID | StatusID | ClientID | Description 
-------+------------+----------+----------+------------ 
1  | 1   | 1  | 1  | Some text 
1  | 2   | 1  | 1  | Otro texto 
1  | 1   | 3  | 2  | Modified text 
2  | 1   | 1  | 1  | Disclaimer1 
3  | 1   | 1  | 1  | Disclaimer2 
4  | 1   | 1  | 1  | Some text 2 

FactLink

ID 
-- 
1 
2 
3 
4 

Статус

ID | Order 
---+------ 
1 | 10 
2 | 100 
3 | 20 

MainView

MainID | StatusOrder | LanguageID | ClientID | Description | Disclaimer | Other 
-------+-------------+------------+----------+---------------+-------------+------ 
50  | 10   | 1   | 1  | Some text  | Disclaimer1 | Blah 
50  | 10   | 2   | 1  | Otro texto | NULL  | Blah 
50  | 20   | 1   | 2  | Modified text | NULL  | Blah 
55  | 10   | 1   | 1  | Some text 2 | Disclaimer2 | Blah Blah 

Вот как я реализовал это всего лишь один столбец, который ссылается на таблицу Fact:

DROP VIEW IF EXISTS dbo.KeywordView 
GO 
CREATE VIEW dbo.KeywordView 
WITH SCHEMABINDING 
AS 
SELECT t.KeywordID, f.ClientID, f.Description Keyword, f.LanguageID, s.[Order] StatusOrder 
FROM dbo.Keyword t 
JOIN dbo.Fact f 
    ON f.FactLinkID = t.KeywordID 
JOIN dbo.Status s 
    ON f.StatusID = s.StatusID 
GO 
CREATE UNIQUE CLUSTERED INDEX KeywordIndex 
    ON dbo.KeywordView (KeywordID, ClientID, LanguageID, StatusOrder) 

Мой предыдущий запрос запрошен для всего, кроме этого StatusOrder. Но добавление в StatusOrder, кажется, усложняет ситуацию. Вот мой предыдущий запрос без StatusOrder. Когда я создал представление на таблице только с одним связанным столбцом Fact, он значительно упростил ситуацию, но распространение этого на два или более столбца оказалось трудным!

SELECT 
    Main.ID, 
    COALESCE(fDescription.Description, dfDescription.Description) Description, 
    COALESCE(fDisclaimer.Description, dfDisclaimer.Description) Disclaimer, 
    Main.Other 
FROM Main 
LEFT OUTER JOIN Fact fDescription 
    ON fDescription.FactLinkID = Main.DescriptionID 
    AND fDescription.ClientID = @clientID 
    AND fDescription.LanguageID = @langID 
    AND fDescription.StatusID = @statusID -- This actually needs to get the largest `StatusOrder`, not the `StatusID`. 
LEFT OUTER JOIN Fact dfDescription 
    ON dfDescription.FactLinkID = Main.DescriptionID 
    AND dfDescription.ClientID = 1 
    AND dfDescription.LanguageID = @langID 
    AND dfDescription.StatusID = @statusID 
... -- Same for Disclaimer 
WHERE Main.ID = 50 

ответ

0

Не уверен, что это самый эффективный или элегантный способ решить эту проблему. Но я, наконец, подумал о том, как это сделать. Проблема с нижеприведенным решением состоит в том, что он больше не может быть проиндексирован. Итак, теперь, чтобы понять, как это сделать, не сворачивая его в производную таблицу.

SELECT 
    x.ID, 
    x.StatusOrder, 
    x.LanguageID, 
    x.ClientID, 
    x.Other, 
    MAX(x.Description), 
    MAX(x.Disclaimer) 
FROM (
    SELECT 
    Main.ID, 
    s.StatusOrder, 
    f.LanguageID, 
    f.ClientID, 
    f.Description, 
    NULL Disclaimer, 
    Main.Other 
    FROM Main 
    JOIN Fact f 
    ON f.FactID = Main.DescriptionID 
    JOIN Status s ON s.StatusID = f.StatusID 
    UNION ALL 
    SELECT 
    Main.ID, 
    s.StatusOrder, 
    f.LanguageID, 
    f.ClientID, 
    NULL Description, 
    f.Description Disclaimer, 
    Main.Other 
    FROM Main 
    JOIN Fact f 
    ON f.FactID = Main.DisclaimerID 
    JOIN Status s ON s.StatusID = f.StatusID 
) x 
GROUP BY x.ID, x.StatusOrder, x.LanguageID, x.ClientID, x.Other 
Смежные вопросы