【问题标题】:SQL Statement with "dynamic" where clause [duplicate]带有“动态”where子句的SQL语句[重复]
【发布时间】:2011-06-05 06:24:43
【问题描述】:

可能重复:
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(公社)和 dbo.pmd 和 dbo.vhv(村庄)之间的 ID(如果 dbo.pmd 表中没有存储值),就会出现问题。

表格如下所示:

表:dbo.pmd
字段:省、区、公社、村(存值为身份证号)

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

【问题讨论】:

  • @OMG Ponies:这里的情况更复杂,这就是为什么这篇文章中的结果不起作用。

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


【解决方案1】:
    INNER JOIN dbo.vhc2 AS vhc2
ON (pmd.commune is NULL OR (pmd.commune = vhc2.commune_id)) 

您无意中在此处执行了笛卡尔连接之类的操作。在 pmd.commune 为 NULL 的行上,pmd.commune IS NULLvhc2 中的每一行评估为真,从而导致 vhc2 中的每一行都连接到该 pmd 行。

您这次的情况与您在上一个问题中描述的情况略有不同,这就是为什么那里提供的解决方案在您当前的情况下对您没有帮助的原因。

外连接的一些变化是你想要的 vhc2 和 vhv,例如:

LEFT OUTER JOIN dbo.vhc2 AS vhc2
ON  pmd.commune = vhc2.commune_id

【讨论】:

    【解决方案2】:

    这两个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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-28
      • 1970-01-01
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 2012-12-25
      • 1970-01-01
      相关资源
      最近更新 更多