如何从列表中填充链接表?

时间:2012-08-21 17:52:46

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

我有三个表,Country,Region和RegionCountry。我需要将链接表填入属于某个区域的国家/地区。我想创建一些带有国家代码列表(如UK,IE)和区域代码(如欧洲EUR)的sql,并将正确的ID插入RegionCountry。我是相对较新的SQL数据传输的东西,任何关于如何做到这一点的想法将不胜感激。谢谢

更新 添加了样本数据。

Country
Id
Name
Code

Region
Id
Name
Code

RegionCountry
Region_Id
Countries_Id

Country
Id                                          Name                    Code
6CEBFBAC-F1F2-444C-88E9-8BC5A8040598    Uganda                  UG
19105690-9F78-4D00-9547-50E4820AB8B2    Ukraine                 UA
988C6645-7436-4369-807B-272E42C026CB    United Arab Emirates    AE
73ACCC38-43D2-4EE4-A59C-3759CE278C78    United Kingdom          GB
AC3B8FA7-B690-4E37-9DEF-FD73EDA69167    United States           US
A1394247-C785-41E0-8550-EB610A348F5E    United States Minor Outlying Islands    UM

Region
Id                                          Name            Code
4A7678AA-2109-4455-9F0F-0F16E02FC438    Europe          EUR
7B060367-0B86-4A57-9908-1C021F697FAA    Western Asia    WEA

3 个答案:

答案 0 :(得分:1)

我想我明白了,你有一个要插入的数据列表,并且在插入时你已经知道了区域代码。你打算如何执行拥有该列表的SQL?

首先,在这种情况下没有理由建立链接表,因为一个国家只能在一个地区。只需将区域ID作为字段放在国家/地区表中即可。

但是,如果一个国家/地区可以属于多个地区,则需要链接表

最简单的事情就是在列表上做一个循环,并为每个条目插入两条记录(区域和国家)

然而,这可能会影响性能,具体取决于您要添加的国家/地区,您可能希望在其中执行批量插入。这将取决于您使用什么语言来完成工作

如果您尝试直接对数据库执行此操作,则可以使用存储过程或其他内容来获取列表,但其语法将根据您使用的数据库而有所不同。

答案 1 :(得分:1)

 DECLARE @RegionID INT  

 -- INPUT Data  
 DECLARE @RegionCode VARCHAR(50)  
 DECLARE @Countries VARCHAR(500)

 SET @RegionCode = 'EUR'  
 SET @Countries = 'UK,IE'

 SELECT @RegionID = Id  
 FROM dbo.Region  
 WHERE Code = @RegionCode  

 INSERT INTO dbo.RegionCountry  
 SELECT @RegionID,Id  
 FROM dbo.Country C  
 INNER JOIN dbo.Split(@Countries, ',') S  
 ON C.Code = S.items

 --Dependency:  
 -- Create this function to split the given string  
 CREATE FUNCTION dbo.Split (  
    @String VARCHAR(8000)  
    ,@Delimiter CHAR(1)
    )
 RETURNS @temptable TABLE (items VARCHAR(8000))
 AS
 BEGIN
    DECLARE @idx INT
    DECLARE @slice VARCHAR(8000)

    SELECT @idx = 1

    IF len(@String) < 1
        OR @String IS NULL
        RETURN

    WHILE @idx != 0
    BEGIN
        SET @idx = charindex(@Delimiter, @String)

        IF @idx != 0
            SET @slice = left(@String, @idx - 1)
        ELSE
            SET @slice = @String

        IF (len(@slice) > 0)
            INSERT INTO @temptable (Items)
            VALUES (@slice)

        SET @String = right(@String, len(@String) - @idx)

        IF len(@String) = 0
            BREAK
    END

    RETURN
 END
 -- Source for split function : http://blog.logiclabz.com/sql-server/split-function-in-sql-server-to-break-comma-separated-strings-into-table.aspx

答案 2 :(得分:0)

这是我最终想出来的。

IF OBJECT_ID('tempdb..#tempCountries') IS NOT NULL DROP TABLE #tempCountries
GO

  SELECT *
  INTO #tempCountries
  FROM Countries
  WHERE code IN ('AL','AD','AM','AT','AZ','BY','BE','BA','BG','HR','CY','CZ','DK','EE','FI','FR','GE','DE','GR','HU','IS','IE','IT','KZ','LV','LI','LT','LU','MK','MT','MD','MC','ME','NL','NO','PL','PT','RO','RU','SM','RS','SK','SI','ES','SE','CH','TR','UA','GB')

Declare @Id uniqueidentifier
Declare @RegionId uniqueidentifier

SET @RegionId = (SELECT TOP 1 Id FROM dbo.Regions WHERE Code = 'EUR')

While (Select Count(*) From #tempCountries) > 0
Begin

    Select Top 1 @Id = Id From #tempCountries

    INSERT INTO RegionCountry(Region_Id,Countries_Id)
    VALUES (@RegionId,@Id)

    Delete #tempCountries Where Id = @Id

End