带有“dynamic”where子句的SQL语句

时间:2011-06-02 01:30:35

标签: sql sql-server tsql sql-server-2008

  

可能重复:
  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.vhd
字段:province_id,district_id,district_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。

2 个答案:

答案 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 NULLvhc2中的每一行的计算结果为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

附注:您可能想重新访问表格命名 - 很难理解数据库设计。