使用Join进行高级查询

时间:2012-06-18 02:51:10

标签: sql join union unique

我正在尝试将包含产品所有细节的产品表转换为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 

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

选择Data.Table

Unique.Data.Table.Colo

Unique.Data.Table.Sz

Unique.Data.Table.Other

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

然后在我们创建所有描述符之后问题的双重部分如何进行新查询并将产品ID分配给描述符。

PI | DI

1 | 1

1 | 3

1 | 4

2 | 1

2 | 3

2 | 4

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

我是否使用数组?

2 个答案:

答案 0 :(得分:0)

我想你想要为不同的类别拆分描述表,比如 - 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列的组合。

这样可以减少注入任何数据错误的机会。跟踪它也很容易。

答案 1 :(得分:0)

好的,如果我理解正确,您希望从列转换为具有id和描述字段的单个表(detailstable)中的行的所有唯一属性:

假设架构:

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

然后将datatable链接到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)