Sql 带联接的高级查询

Sql 带联接的高级查询,sql,join,union,unique,Sql,Join,Union,Unique,我正在尝试将包含产品所有细节的产品表转换为SQL中的单独表。除了重复的描述符细节外,我已经完成了所有工作 我的问题是所有的产品都有尺寸/颜色/款式/其他许多其他产品所包含的。我只想对所有项目使用一个大小或颜色描述符,并对所有产品重复使用“ID”,我认为这是产品ID的父键,这是…外键。唯一的问题是,每个描述符都会分配多个外键。所以我在考虑让它跳过为每个描述符计算一个外部父键,然后检查该描述符是否存在,以及它是否使用它的键作为描述符 数据表 PI Colo Sz OTHER 1

我正在尝试将包含产品所有细节的产品表转换为SQL中的单独表。除了重复的描述符细节外,我已经完成了所有工作

我的问题是所有的产品都有尺寸/颜色/款式/其他许多其他产品所包含的。我只想对所有项目使用一个大小或颜色描述符,并对所有产品重复使用“ID”,我认为这是产品ID的父键,这是…外键。唯一的问题是,每个描述符都会分配多个外键。所以我在考虑让它跳过为每个描述符计算一个外部父键,然后检查该描述符是否存在,以及它是否使用它的键作为描述符

数据表

PI  Colo   Sz   OTHER


1        |   Blue  |  5  |    Vintage

2        |   Blue  |  6   |   Vintage

3        |   Blac  | 5   |   Simple

4        |   Blac |  6   |   Simple
===================================

DI Description

1       |   Blue

2       |   Blac

3       |   5

4       |   6

6       |   Vintage

7       |  Simple 
它的目标表是

===================================

DI Description

1       |   Blue

2       |   Blac

3       |   5

4       |   6

6       |   Vintage

7       |  Simple 
=============================

DI Description

1       |   Blue

2       |   Blac

3       |   5

4       |   6

6       |   Vintage

7       |  Simple 
选择数据表

Unique.Data.Table.Colo

Unique.Data.Table.Sz

Unique.Data.Table.Other

=======================================

DI Description

1       |   Blue

2       |   Blac

3       |   5

4       |   6

6       |   Vintage

7       |  Simple 
然后,在我们创建所有描述符之后,问题的两个部分是如何执行新的查询并将产品ID分配给描述符

皮迪

1 | 1

1 | 3

1 | 4

2 | 1

2 | 3

2 | 4

通过了解如何做到这一点,我应该能够为产品中的所有300+列复制此模式。其中一些字段的大小超过60个字符,因此将节省大量空间


我是否使用数组?

我想您应该将描述表拆分为不同的类别,如-colorDescription、sizeDescription等

如果不可行,我建议增加一列显示类别属性:

DI Description  Category

1 | Blue       | Color

2 | Blac       | Color

3 | 5          | Size

4 | 6          | Size

6 | Vintage    | Other

7 | Simple     | Other
然后将该表中的主键作为ID和Category列的组合


这将减少注入任何数据错误的机会。也很容易找到它。

好的,如果我没有弄错的话,您希望将所有唯一属性从列转换为单个表(
detailstable
)中的行,该表有一个id和一个描述字段:

假设模式为:

datatable
------------------
PI [PK]
Colo
Sz
OTHER

detailstable
------------------
DI [PK]
Description
您可以首先使用以下方法将所有唯一属性放入自己的表中:

INSERT INTO detailstable (Description)
SELECT 
    a.description
FROM
    (
        SELECT DISTINCT Colo AS description
        FROM datatable

        UNION

        SELECT DISTINCT Sz AS description
        FROM datatable

        UNION

        SELECT DISTINCT OTHER AS description
        FROM datatable
    ) a
然后,为了将
数据表
链接到
detailstable
,我假设您有一个定义如下的交叉引用表:

datadetails
------------------
PI [PK]
DI [PK]
然后,您可以执行以下操作:

INSERT INTO datadetails (PI, DI)
SELECT
    a.PI
    b.DI
FROM
    datatable a
INNER JOIN
    detailstable b ON b.Description IN (a.Colo, a.Sz, a.OTHER)

因此,您试图将
Colo
字段的所有唯一值放入一个单独的
Colo
表中,对于
Sz
Other
也一样。。。他们也有自己的桌子,对吗?主键是自动递增的吗?是的,这是正确的。但是它们都进入同一个表,称为属性或描述,主键将自动递增。是的,我确实忘记了这一点。我们将有一个额外的列(所有的属性都被更改为ID的我相信),我想就是这样,联合是他们的关键,谢谢!现在我可以开始300+列联合../颤抖