查看语言/客户端/状态表上的表

时间:2016-12-05 16:41:14

标签: sql sql-server sql-view

我想使用视图表const HttpClient = axios.create({ baseURL: env.baseUrl, }); HttpClient.interceptors.response.use((response) => { return response; }, (error) => { return Promise.resolve({ error }); }); 简化数据,但我很难搞清楚。

我有一个MainView表,该表特定于客户端,语言和状态。 Fact表中的ID来自Fact表,其中只有FactLink列。 FactLinkID表格中有一个Status列,需要在汇总视图中显示,而不是Order。我的StatusID表引用了多列中的Main表。

最终目标是能够通过FactLanguageIDStatusOrder的复合索引查询视图表,比以前更简单,抓取指定的最大{ {1}}和指定的ClientIDStatusOrder 1.所以,这就是我希望通过视图表简化的内容。

所以,

主要

ClientID

事实

ClientID

FactLink

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

的MainView

ID
--
1
2
3
4

以下是我使用引用ID | Order ---+------ 1 | 10 2 | 100 3 | 20 表的单个列实现它的方法:

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

1 个答案:

答案 0 :(得分: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