sql server

时间:2015-06-05 06:20:25

标签: sql-server

我需要在SQL Server中创建嵌套表。任何人都可以指导我如何创建它们。为了给出背景,我试图将RDBMS从oracle移动到SQL服务器。

表的结构如下。我将表'Employees'与地址作为列之一。我还有一个桌子,街道,镇,区,州。当我查询表'Employees'时,我应该在地址列的地址表中看到所有列的属性名称和值。

雇员: 列:ID,FirstName,LastName,dept,gender,dob,address

地址(嵌套表): 列:街道,镇,区,州

这是在oracle中使用嵌套表和用户定义的数据类型完成的。任何人都可以建议我在SQL服务器中替代这个。我如何在SQL服务器中实现此要求。

3 个答案:

答案 0 :(得分:2)

我认为最好的解决方案是,当您为地址创建单独的表并链接到Employees时。 例如:

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

答案 1 :(得分:1)

有3例:

  1. 10-1关系(伪一对一)
  2. 1*关系(一对多)
  3. **关系(多对多)
  4. 现在您应该决定选择哪一个。

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

    如果一个员工可以有多个地址,一个地址可以有多个员工(从您的数据中听起来可能是因为2个员工可以住在同一条街上的同一个城镇),那么您应该坚持选项3。 / p>

    如果以上两种情况均不正确,则只需选择选项1。

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

    1)

    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)

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

    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)
                                   ....)
    

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

    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)

    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)
    

答案 2 :(得分:0)

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

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

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