0

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

IE

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

我的Person feature观点需要列出不同的HairColours

HairColour Ginger
HairColour Brown
HairColour Blond

针对这些Person feature行中的每一行,我记录了Recommended Products.

从关系的角度来看,这有点奇怪,但有原因。Person Feature"我可以在添加Person记录时使用INSTEAD OF INSERT视图上的触发器来构建视图。但它会变得混乱。另一种方法是Person Feature基于表的 a 作为视图,然后链接到SELECT DISTINCT该表。但是我在视图上没有主键,因为它是一个视图。我不会更新此视图。还需要考虑当记录消失时如何处理记录,因为它不是基于物理表的。PersonRecommended ProductsPerson FeatureSELECT DISTINCTPerson RecommendationPerson Feature

请问对此有什么想法吗?

编辑

我有一张 People 表,其中包含多个记录中 HairColour 的重复值,例如,不止一个人有金发。我需要创建一个表或视图来表示上述“HairColour”记录的不同列表。针对这些“HairColour”记录中的每一个,我需要链接另一个名为Product Recommendation. 开始的主要问题是创建这个不同的记录列表。它应该是表还是基于SELECT DISTINCT查询的视图?

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

如果HairColour需要成为一个表,那么我需要确保每次Person添加记录时它都有正确的记录。显然使用视图会自动执行此操作,但我不确定您是否可以将另一个表挂在视图上。

4

3 回答 3

3

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

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. 如上所述创建 HairColor 表。

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

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

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

  5. 删除 Person.HairColour 列。

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

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

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

于 2013-05-21T16:55:03.877 回答
0

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

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 关键字在选择列表中所做的工作相同。这将创建一个具有“名称”和“头发颜色”的唯一组合的临时表。

于 2013-05-21T16:32:57.970 回答
0

您需要首先在您的帖子(或您的脑海中)清除一些事情:

1) 目标是什么?忘记表格和视图等等。像普通人一样表达你的目标。例如,从我从您的帖子中收集到的信息:“我的目标是根据每个人的头发颜色列出推荐产品。”

2)一旦你有了,检查你有什么数据。我假设您有一个“Persons”表,其中包含“Name”和“HairColour”列。你检查你的数据并问自己:“我需要更多数据来实现我的目标吗?” 根据您的帖子,我说是的:您还需要头发颜色和产品 ID 之间的“匹配”。这必须由您提供或编程。没有自动的说法,例如“棕色表示产品 X、Y、Z。

3) 获得所有需要的数据后,您可以问:我可以执行一个查询来返回我的目标的近似值吗?例如看这个小提琴: http ://sqlfiddle.com/#!2/fda0d6/1

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

4)当您有疑问时,您可以跟进:我需要其他格式吗?这是查询还是应用程序的工作?等等。但我认为这是一个不同的问题。

于 2013-05-21T17:44:19.853 回答