可能重复:
Howto build a SQL statement with using IDs that might not be available in the table?
你好,我尝试用一些未知变量构建一个SQL语句。 我想从表dbo.pmd中选择省,区,公社和村庄。 由于只存储了ID,我需要从值表中读取名称。 这对于省和地区来说没有问题,因为它们总是填写在表dbo.pmd中。无论如何,公社和村庄不是强制性的,因此可能没有填补。 如果我比较dbo.pmd和dbo.vhcs(communes)以及dbo.pmd和dbo.vhv(村庄)之间的ID(如果dbo.pmd表中没有存储值),则会出现问题。
表格如下:
表:dbo.pmd
字段:省,区,公社,村(存储值是ID号)
表:dbo.vhp
fields:country_id,province_id,province_en(省名)
表:dbo.vhc2
fields:district_id,commune_id,commune_en(commune的名称)
表:dbo.vhv
字段:commune_id,village_id,village_en(公社名称)
我目前的陈述如下:
SELECT pmd.patient_code, pmd.last_name, pmd.first_name, pmd.age, pmd.sex, pmd.province, pmd.district, pmd.commune, pmd.village
FROM dbo.pmd AS pmd
INNER JOIN dbo.vhp AS vhp
ON pmd.province = vhp.province_id
INNER JOIN dbo.vhd AS vhd
ON pmd.district = vhd.district_id
INNER JOIN dbo.vhc2 AS vhc2
ON (pmd.commune is NULL OR (pmd.commune = vhc2.commune_id))
INNER JOIN dbo.vhv AS vhv
ON (pmd.village is NULL OR (pmd.village = vhv.village_id))
ORDER BY pmd.last_name
我的数据库中有两个条目。一个带有commune_id和village_id = NULL的条目,一个带有commune_id和village_id =一些ID号。
我在约2分钟后停止执行此语句,并且:8273612行都具有相同的值,仅显示带有commund_id的条目,并且village_id等于NULL。
我正在使用Microsoft SQL Server 2008。
答案 0 :(得分:2)
INNER JOIN dbo.vhc2 AS vhc2
ON (pmd.commune is NULL OR (pmd.commune = vhc2.commune_id))
你无意中在这里做了类似笛卡尔联盟的事情。在pmd.commune
为NULL的行上,pmd.commune IS NULL
对vhc2
中的每一行的计算结果为true,导致vhc2中的每一行都连接到该pmd
行。
这次你的情景与你在上一个问题中描述的情况略有不同,这就是为什么那里提供的解决方案在你目前的情况下没有帮助你。
外连接的一些变化是你想要的vhc2& vhv,例如:
LEFT OUTER JOIN dbo.vhc2 AS vhc2
ON pmd.commune = vhc2.commune_id
答案 1 :(得分:1)
对联接的这两个is null
检查导致了问题。我想你正在寻找左联盟
SELECT pmd.patient_code, pmd.last_name, pmd.first_name, pmd.age, pmd.sex, pmd.province, pmd.district, pmd.commune, pmd.village
FROM dbo.pmd AS pmd
INNER JOIN dbo.vhp AS vhp
ON pmd.province = vhp.province_id
INNER JOIN dbo.vhd AS vhd
ON pmd.district = vhd.district_id
LEFT JOIN dbo.vhc2 AS vhc2
ON pmd.commune = vhc2.commune_id
LEFT JOIN dbo.vhv AS vhv
ON pmd.village = vhv.village_id
ORDER BY pmd.last_name
附注:您可能想重新访问表格命名 - 很难理解数据库设计。