我在这里可能是完全标准的,但我有一个表,在记录中有重复的值,即People
和HairColour
。我需要做的是创建另一个表,该表包含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所指出的,这是一个规范数据的好机会。
如上所述创建HairColour表。
从您喜欢的任何来源填充它,例如上面的insert语句。
修改Person和ProductRecommendation表以包含HairColourID字段,该字段是指向HairColour表PK字段的整数外键。
更新Person.HearColourID以指向Person.HearColor列中提到的颜色。
删除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( 当你有查询时,你可以继续问:我需要其他格式的查询吗?这是查询作业还是应用程序作业?等等。但我认为这是一个不同的问题。