首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sql server中的嵌套表和用户定义的数据类型

问sql server中的嵌套表和用户定义的数据类型
EN

Stack Overflow用户
提问于 2015-06-05 14:20:25
回答 3查看 11.3K关注 0票数 0

我需要在SQL server中创建嵌套表。任何人可以指导我如何创建它们。为了给出一个背景,我正在尝试将RDBMS从oracle迁移到SQL server。

表的结构如下。我有一个表'Employees‘,其中一个列是address。我还有一张桌子,上面有“街道”、“城镇”、“区”、“州”等列。当我查询表'Employees‘时,我应该在address列中看到address表中所有列的属性名称和值。

Employees:分栏: ID,FirstName,LastName,部门,性别,道布,地址

地址(嵌套表):包含列:街道、城镇、区域、州

这是在oracle中使用嵌套表和用户定义的数据类型完成的。有没有人能建议我在SQL server中有什么替代方案?如何在SQL server中实现此要求。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-05 15:12:40

有3种情况:

  1. 1到one)
  2. 1的关系(伪一到many)
  3. *到0-1的关系(一到*到*的关系(多对多)

现在,您应该决定选择哪一个。

如果一个员工可以有多个地址,您可以使用选项2。

如果一个员工可以有多个地址,一个地址可以有多个员工(从你的数据来看,这听起来可能是因为两个员工可以住在同一条街的同一个城镇),那么你应该坚持选择3。

如果以上两种情况都不成立,那么只需选择选项1。

现在是这些选项的技术部分:

1)

代码语言:javascript
复制
create table Employees(employee_id int, --will be PK
                       first_name varchar(50)
                       last_name varchar(50)
                       ....)

create table EmployeeAddresses(employee_id int, --will be PK and FK on Employees.employee_id
                               town varchar(50)
                               street varchar(50)
                               ....)

2)

如果一个员工可以有多个地址:

代码语言:javascript
复制
create table Employees(employee_id int, --will be PK
                       first_name varchar(50)
                       last_name varchar(50)
                       ....)

create table EmployeeAddresses(address_id int, --will be PK
                               employee_id int, --will be FK on Employees.employee_id
                               town varchar(50)
                               street varchar(50)
                               ....)

如果一个地址可以有多个员工:

代码语言:javascript
复制
create table Employees(employee_id int, --will be PK
                       address_id int, --will be PK and FK on Addresses.address_id
                       first_name varchar(50)
                       last_name varchar(50)
                       ....)

create table Addresses(address_id int, --will be PK 
                       town varchar(50)
                       street varchar(50)
                       ....)

3)

代码语言:javascript
复制
create table Employees(employee_id int, --will be PK
                       first_name varchar(50)
                       last_name varchar(50)
                       ....)

create table Addresses(address_id int, --will be PK
                       town varchar(50)
                       street varchar(50)
                       ....)

create table EmployeeAddresses(employee_id int, --will be PK and FK on Employees.employee_id
                               address_id int, --will be PK and FK on Addresses.address_id)
票数 1
EN

Stack Overflow用户

发布于 2015-06-05 14:36:46

我认为最好的解决方案是,当你为地址创建一个单独的表,并链接到员工。例如:

代码语言:javascript
复制
create table [Employee]
(ID int not null
, FirstName varchar(100) not null
, LastName varchar(100) not null
--...
)
go
create table [Address]
(ID int IDENTITY(1,1) not null
, EmployeeID int not null
, Street varchar(200)
, Town varchar(200)
--...
)
go
ALTER TABLE [Address]  WITH CHECK ADD  CONSTRAINT [FK_Address_Employe] FOREIGN KEY(EmployeeID)
REFERENCES [Employee] ([ID])
go
票数 2
EN

Stack Overflow用户

发布于 2015-06-05 14:34:40

在SQL Server Analysis Services中,必须将数据作为案例表中包含的一系列案例提供给数据挖掘算法。然而,并不是所有的情况都可以用一行数据来描述。例如,一个案例可能派生自两个表:一个表包含客户信息,另一个表包含客户采购。客户信息表中的单个客户在客户采购表中可能有多个项目,这使得使用单行来描述数据变得困难。Analysis Services通过使用嵌套表提供了一种独特的方法来处理这些情况。

为了创建嵌套表,两个源表必须包含已定义的关系,以便一个表中的项可以与另一个表相关。在SQL Server数据工具(SSDT)中,可以在数据源视图中定义此关系。有关如何定义两个表之间关系的详细信息,请参阅如何使用数据源视图设计器(Analysis Services)添加、删除、查看或修改逻辑关系。

https://technet.microsoft.com/en-us/library/ms174835(v=sql.110).aspx

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30659630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档