Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 根据用户id选择值(属性)的唯一组合_Sql_Database_Many To Many_Dimensional - Fatal编程技术网

Sql 根据用户id选择值(属性)的唯一组合

Sql 根据用户id选择值(属性)的唯一组合,sql,database,many-to-many,dimensional,Sql,Database,Many To Many,Dimensional,我有一个表,其中有一个用户id和该用户每个返回原因的一条新记录。如图所示: | user_id | return_reason | |--------- |-------------- | | 1 | broken | | 2 | changed mind | | 2 | overpriced | | 3 | changed mind | | 4 | changed mind | 我想

我有一个表,其中有一个用户id和该用户每个返回原因的一条新记录。如图所示:

| user_id | return_reason | |--------- |-------------- | | 1 | broken | | 2 | changed mind | | 2 | overpriced | | 3 | changed mind | | 4 | changed mind | 我想做的是为新表中适用的每个值组合生成一个外键,并将该键应用于新表中的用户id。有效地创建多对多关系。结果是这样的:

维度表->

| reason_id | return_reason | |----------- |--------------- | | 1 | broken | | 2 | changed mind | | 2 | overpriced | | 3 | changed mind | 事实表->

| user_id | reason_id | |--------- |----------- | | 1 | 1 | | 2 | 2 | | 3 | 3 | | 4 | 3 |
我的思想过程是用游标遍历表,但这似乎是一个标准问题,因此有一种更有效的方法。这类问题是否有特定的名称?我还考虑了旋转和取消旋转。但那看起来也不太干净。非常感谢您提供有关如何处理此问题的任何帮助或参考文章。

问题涉及数据规范化和关系完整性。您的概念并没有真正意义——维度表用相同的ID显示了两个不同的原因,事实表丢失了一条记录。这种多对多关系的传统模式是三个表,如下所示:

关于用户和用户ID的用户表信息是唯一的 关于原因和原因ID的原因表信息是唯一的 UserReasons连接表将用户与原因关联-您的 现有表格。假设用户可以与相同的原因关联 多次,可能还需要ReturnDate和OrderID_FK字段 出于某些原因。 因此,需要将第一个表UserReasons中的原因描述替换为ReasonID。在该表中添加一个数字长度的整型字段ReasonID_FK,以保存ReasonID键

要基于当前数据构建原因表,请使用DISTINCT: 从UserReasons中选择DISTINCT return\u reason to Reasions

在新表中,将return_reason字段重命名为ReasonDescription,并添加一个自动编号字段ReasonID

现在运行更新操作以填充UserReasons中的ReasonID_FK字段。 更新UserReasons内部联接UserReasons.return\u reason Reasons.ReasonDescription设置UserReasons.ReasonID\u FK=Reasons.ReasonID


当一切正常时,删除return\u reason字段。

为什么结果集中的行比原始数据少一行?结果集中会有一个属性到用户的映射。因此,表中每个用户应该有一条记录。原因_id是该表中的外键。在另一个表中,我将有一个在每个外键上展开的维度表。例如,在维度表中,reason_id=2将有两行,一行表示“改变主意”,另一行表示“定价过高”。但是它们会共享相同的原因id。因此,将这两个原因的一个实例捕获在一起,您想要的结果只显示一个表。如果你想生成两个或更多的表格,那么请也给我们看看这些表格。好的,我更新了帖子。谢谢,嗯?您在原因表中有重复的ID。我就是不懂逻辑。为什么事实表不像原始数据那样有五行?