2011-06-02 127 views
4

可能重复:
Howto build a SQL statement with using IDs that might not be available in the table?SQL语句 “动态” where子句

你好在一起,我尝试建立一个SQL语句与一些未知的变数。 我想从表dbo.pmd中选择省,区,公社和村庄。 由于只存储了ID,我需要从值表中读取名称。 这对于省和地区来说没有问题,因为它们将始终填充在表dbo.pmd中。无论如何,公社和村庄不是强制性的,可能因此没有填补。 如果我比较dbo.pmd和dbo.vhcs(communes)和dbo.pmd和dbo.vhv(乡村)之间的ID(如果dbo.pmd表中没有存储值),这就是问题所在。

的表是这样的:

表:dbo.pmd
字段:省,区,公社,村(储值是ID号)

表:dbo.vhp
领域:COUNTRY_ID,province_id,province_en(省名)

表:dbo.vhd
领域:province_id,district_id,district_en(区的名称)

表:dbo.vhc2
领域:district_id,commune_id,commune_en(公社的名字)

表: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

@OMG小马:这里这种情况比较复杂这就是为什么结果在这篇文章中不起作用。 – Daniel 2011-06-02 02:17:19

回答

2
INNER JOIN dbo.vhc2 AS vhc2 
ON (pmd.commune is NULL OR (pmd.commune = vhc2.commune_id)) 

您无意中做了类似笛卡尔连接这样的事情。在pmd.commune为NULL的行上,pmd.commune IS NULLvhc2中的每一行的计算结果都为true,从而导致vhc2中的每一行都加入到该行中。

这次你的场景与你在前面的问题中描述的有些不同,这就是为什么当前提供的解决方案在当前情况下没有提供帮助。

在外的一些变化是加入你想要VHC2 & VHV什么,例如:

LEFT OUTER JOIN dbo.vhc2 AS vhc2 
ON pmd.commune = vhc2.commune_id 
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 

旁注:你可能想重温表namings - 很难理解数据库设计。