根据当前表值从其他外键表中获取值

时间:2012-06-28 11:17:11

标签: sql sql-server sql-server-2008 tsql

我正在开发一个项目,我需要将数据从Excel工作表提取到SQL Server    那个位成功了。现在我的问题是,对于特定的列
叫产品尺寸,我想根据产品尺寸在其他表中更新当前表,我真的很困惑,请帮帮我

请查找表格结构

    CREATE TABLE [dbo].[T_Product](
[ProductID] [int] IDENTITY(1,1) NOT NULL,
[PartNo] [nvarchar](255) NULL,
[CategoryID] [int] NULL,
[MaterialID] [float] NULL,
[WireformID] [float] NULL,
[ProductName] [nvarchar](50) NULL,
[ProductSize] [nvarchar](50) NULL,
[ProductLength] [varchar](20) NULL,
[ProductActive] [bit] NULL,
[ProductImage] [varchar](60) NULL
 ) ON [PRIMARY]

     CREATE TABLE [dbo].[T_ProductSize](
[Code] [int] IDENTITY(1,1) NOT NULL,
[ProductSize] [nvarchar](50) NULL,
[Length] [nchar](20) NULL
 ) ON [PRIMARY]

 GO

3 个答案:

答案 0 :(得分:1)

好的,所以忽略以前的答案,我得到了错误的结束!!

我想要这样的事情:

UPDATE T_Product
SET [ProductLength] = ps.[Length]
FROM T_Product p
INNER JOIN T_ProductSize ps
ON p.[ProductSize] = ps.[ProductSize]

这将取T_ProductSize的Length值,并根据T_Product.ProductSize的值将其放在T_Product.ProductLength中

答案 1 :(得分:0)

您提到了一个外键但是没有包含它的定义。它是在你的例子中的两个表之间吗?如果是这样,哪些列成为关键?产品尺寸是关键吗?如果是这样,那么你的问题没有多大意义,因为两个表中的值都是相同的。

您是否有可能将产品尺寸存储在单独的表中而不是存储在T_Product表中?在那种情况下,然后在T_Product中代替ProductSize,您将需要来自T_ProductSize表的代码(我是否也可以建议代替'代码',您将其称为'ProductSizeCode'或更好'ProductSizeId'或类似?具有简称为代码的列可以非常混乱,因为你没有简单的方法知道该值是什么表)。此外,您应该始终在每个表上创建一个主键:没有外键,就不能拥有外键。它们不必是群集的,这将取决于您对表的搜索,但我在此示例中使用群集PK。这会给你这样的东西:

CREATE TABLE [dbo].[T_Product](
    [ProductID] [int] IDENTITY(1,1) NOT NULL,
    [PartNo] [nvarchar](255) NULL,
    [CategoryID] [int] NULL,
    [MaterialID] [float] NULL,
    [WireformID] [float] NULL,
    [ProductName] [nvarchar](50) NULL,
    [ProductSizeId] [int] NOT NULL,
    [ProductLength] [varchar](20) NULL,
    [ProductActive] [bit] NULL,
    [ProductImage] [varchar](60) NULL

CONSTRAINT [PK_T_Product] PRIMARY KEY CLUSTERED 
    (
    [ProductID] ASC
    ) ON [PRIMARY]
) ON [PRIMARY]

GO

CREATE TABLE [dbo].[T_ProductSize](
    [ProductSizeId] [int] IDENTITY(1,1) NOT NULL,
    [ProductSize] [nvarchar](50) NULL,
    [Length] [nchar](20) NULL
CONSTRAINT [PK_T_ProductSize] PRIMARY KEY CLUSTERED 
    (
    [ProductSizeId] ASC
    ) ON [PRIMARY]
) ON [PRIMARY]
GO

--Now add your foreign key to T_Product.
ALTER TABLE [T_Product]  WITH NOCHECK ADD CONSTRAINT [FK_Product_ProductSize] FOREIGN KEY([ProductSizeId])
REFERENCES [T_ProductSize] ([ProductSizeId])
GO
ALTER TABLE [T_Product] CHECK CONSTRAINT [FK_Product_ProductSize]
GO

现在,要检索您的产品以及产品尺寸,请使用以下内容:

SELECT p.[ProductID], p.[PartNo], p.[CategoryID], p.[MaterialID], p.[WireformID], p.[ProductName],
    ps.[ProductSize], ps.[Length], p.[ProductLength], p.[ProductActive], p.[ProductImage]
FROM [T_Product] p
INNER JOIN [T_ProductSize] ps
ON ps.[ProductSizeId] = p.[ProductSizeId]

如果我理解正确,那么这就是我认为你所追求的。如果没有,那么请再解释一下你需要什么,我会再试一次。

答案 2 :(得分:0)

试试这个......

UPDATE  t2
SET     t2.ProductLength = t1.Length
FROM    dbo.T_ProductSize t1
        INNER JOIN dbo.T_Product t2 ON t1.ProductSize = t2.ProductSize