在SQL Server中查找所有父无子记录以创建“默认值”子级

时间:2013-05-16 22:15:16

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

首先让我得到一些东西:我对SQL的了解非常非常有限(只是理解基本的CRUD操作,遗憾的是 - 跟我谈谈JOIN和东西,你也可以说世界语)。这是我知道我需要并且实际上正在努力的事情,但它也需要时间,我现在不需要解决这个特定问题的时间。

我有几张桌子,如下:

TBL_Cities      TBL_Provinces      TBL_Regions      TBL_Countries
----------      -------------      -----------      -------------
CityID          ProvinceID         RegionID         CountryID
ProvinceID      RegionID           CountryID        CountryCode
CityCode        ProvinceCode       RegionCode       CountryName
CityName        ProvinceName       RegionName

正如您可能猜测的那样,是的,表格通过从CitiesProvinces,从ProvincesRegions以及{{1}的外键相关联} Regions(请注意数据库设计不是我的创作,所以我只是转发我所拥有的。)由于这种结构,有许多省份附有几个城市,而且还有一些省份附有 no 城市。

由于这种设计,一个人的地址是通过从最底部的位置实体(对于这个特定的例子,将是城市)链接来完成的。到目前为止有道理,对吧?

问题:我需要以某种方式找出所有无子Countries实体的ID,并在Province表中为每个实体生成一个“默认”条目那些没有孩子的Cities,这样我们当前的地址构建引擎就可以工作,而不必修改当前的数据库列结构(即,从Provinces构建一个“完整”位置,然后一直工作到City)。这......不仅仅是我的能力,所以我在这里请求帮助。

我知道这可能太多了,但有人可以告诉我如何解决这个问题,或者至少让我指向正确的方向吗?

2 个答案:

答案 0 :(得分:0)

要查找所有无子女省份,请使用

SELECT ProvinceId FROM TBL_Provinces
WHERE ProvinceID NOT IN
(SELECT DISTINCT(ProvinceID) FROM TBL_Cities)

为每个省份插入默认值

INSERT INTO TBL_Cities (ProvinceID, CityCode, CityName)
SELECT ProvinceId, 'DefaultCityCode', 'DefaultCityName' FROM TBL_Provinces
WHERE ProvinceID NOT IN
(SELECT DISTINCT(ProvinceID) FROM TBL_Cities)

我不确定您为什么要添加默认城市名称。如果一个省没有城市,那就应该没事了。

答案 1 :(得分:0)

至于所有城市都不会提供,并且需要一个默认的城市,我不会限制城市的增加,并采取以下措施:

INSERT INTO TBL_Cities (ProvinceID, CityCode, CityName)
SELECT ProvinceId, '<unknown>', 'DefaultCityName for ' + ProvinceName 
FROM TBL_Provinces

通过多次使用

运行查询来防止重复
INSERT INTO TBL_Cities (ProvinceID, CityCode, CityName)
SELECT ProvinceId, '<unknown>', 'DefaultCityName for ' + ProvinceName 
FROM TBL_Provinces
LEFT JOIN TBL_Cities C on C.CityName='DefaultCityName for ' + ProvinceName 
where C.CityID is NULL