0

我有三个表,Country、Region 和 RegionCountry。我需要使用属于某个地区的国家/地区填充链接表。我想创建一些 sql,它采用国家代码列表(如英国、IE)和区域代码(如欧洲的 EUR)并将正确的 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
4

3 回答 3

1

我想我理解得更好,您有一个要插入的数据列表,并且您在插入时已经知道区域代码。你将如何执行 SQL,谁有那个列表?

首先,在这种情况下没有必要使用链接表,因为一个国家只能位于一个地区。只需将区域 ID 作为字段放在国家/地区表上即可。

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

最简单的事情就是对列表进行循环,并为每个条目插入两条记录(地区和国家)

但是,这可能会对性能产生影响,具体取决于您要添加的国家/地区数量,您可能希望在哪里进行批量插入。这一切都取决于您使用什么语言来完成这项工作

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

于 2012-08-21T20:03:37.743 回答
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
于 2012-08-21T20:15:10.040 回答
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
于 2012-08-21T22:45:42.590 回答