如何使用带有distinct子句的SQL Server视图链接到详细信息表



我在这里可能是完全标准的,但我有一个表,在记录中有重复的值,即PeopleHairColour。我需要做的是创建另一个表,该表包含Person记录的Group中所有不同的HairColour值。

Name      HairColour
--------------------
Sam       Ginger
Julie     Brown
Peter     Brown
Caroline  Blond
Andrew    Blond

我的Person feature视图需要列出不同的HairColours:

HairColour Ginger
HairColour Brown
HairColour Blond

针对这些CCD_ 8行中的每一行,我记录CCD_。

从关系的角度来看,这有点奇怪,但这是有原因的。我可以在视图上使用INSTEAD OF INSERT触发器添加Person记录的同时构建Person Feature"视图。但它变得一团糟。另一种选择是仅将Person Feature作为基于Person表的SELECT DISTINCT的视图,然后将Recommended Products链接到该视图。但是我在Person Feature视图上没有主键,因为它是SELECT DISTINCT视图。我不会更新此视图。此外,当Person Feature记录消失时,需要考虑如何处理Person Recommendation记录,因为它不是基于物理表的。

你对此有什么想法吗?

编辑

我有一个表格,里面有很多记录中HairColour值重复的人,例如,不止一个人有金色头发。我需要创建一个表或视图,表示如上所述的"HairColour"记录的不同列表。针对这些"HairColour"记录,我需要链接另一个名为Product Recommendation的表。首先要解决的主要问题是创建这个不同的记录列表。它应该是一个表还是一个基于SELECT DISTINCT查询的视图?

所以Person>-HairColour(不同的表或不同的视图(-<Product Recommendation

如果HairColour需要是一个表,那么每次添加Person记录时,我都需要确保其中有正确的记录。显然,使用View会自动完成这一操作,但我不确定是否可以将另一个表挂在View上。

如果我理解正确,您需要一个带有主键的表,该表列出了不同表中不同的头发颜色。

CREATE TABLE Haircolour(
ID INT IDENTITY(1,1) NOT NULL,
Colour VARCHAR(50) NULL
CONSTRAINT [PK_Haircolour] PRIMARY KEY CLUSTERED (ID ASC))

然后插入您的记录。如果这是在查询一个名为"Person"的表,它将看起来像这样:

INSERT INTO Haircolour (Colour) SELECT DISTINCT HairColour FROM Person

这是你想要的吗?

更新:

您最近的编辑显示,您正在寻找Person和ProductRecommendation表之间的多对多关系,HairColour表充当交叉引用表。

正如ErikE所指出的,这是一个规范数据的好机会。

  1. 如上所述创建HairColour表。

  2. 从您喜欢的任何来源填充它,例如上面的insert语句。

  3. 修改Person和ProductRecommendation表以包含HairColourID字段,该字段是指向HairColour表PK字段的整数外键。

  4. 更新Person.HearColourID以指向Person.HearColor列中提到的颜色。

  5. 删除Person.HearColour列。

这涉及到放弃将自由形式的新颜色名称放入Person表的能力。任何新的颜色现在都必须添加到HairColour表中;这些是唯一可用的颜色。

外键约束强制使用可用颜色的列表。这是一件好事。引用完整性使您的数据保持干净,并防止出现许多意外错误。

现在,您可以放心地在具有一定权重的数据结构上构建ProductRecommendation表。

您只是在寻找不同头发颜色的视图吗?

CREATE VIEW YourViewName AS
SELECT DISTINCT HairColour 
FROM YourTableName

您可以像查询表一样查询此视图:

SELECT 'HairColour: ' + HairColour
FROM YourViewName

如果您正在尝试创建一个新的(临时(表,语法看起来像:

SELECT Name, HairColour
INTO #Temp
FROM YourTableName
GROUP BY Name, HairColour

这里GROUP BY所做的工作与DISTINCT关键字在选择列表中所做的相同。这将创建一个具有"名称"one_answers"头发颜色"独特组合的临时表。

您需要首先清理帖子中(或脑海中(的一些内容:

1( 目标是什么?忘掉表格和视图之类的东西吧。像普通人一样表达你的目标。例如,我可以从你的帖子中收集到:"我的目标是根据每个人的头发颜色列出一份推荐产品清单。">

2( 一旦你有了这些,检查一下你有什么数据。我假设您有一个"人员"表,列为"姓名"one_answers"发色"。你检查你的数据,然后问自己:"我还需要更多的数据来实现我的目标吗?"根据你的帖子,我同意:你还需要头发颜色和产品ID之间的"匹配"。这必须由您提供或编程。例如,没有自动的方法来表示"棕色意味着产品X、Y、Z。

3( 在你有了所有需要的数据后,你可以问:我可以执行一个查询来返回我的目标的近似值吗?例如,请参见此小提琴:http://sqlfiddle.com/#!2/fda0d6/1

我还定义了您的"选择不同"视图,但我看不出它将在哪里使用。你的目标(如你的帖子中所定义的(并没有明确说明这一点。如果您在Recommended_Products_HairColour中提供了一个完整的列表,则不需要一个不同的视图。JOIN操作会处理"丢失的颜色"(在我的示例中为"绿色"(

4( 当你有查询时,你可以继续问:我需要其他格式的查询吗?这是查询作业还是应用程序作业?等等。但我认为这是一个不同的问题。

最新更新