我有三个表,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
答案 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