如何使用表中可能不可用的ID构建SQL语句?

时间:2011-05-31 10:07:02

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

使用Microsoft SQL Server 2008,假设有一个table1可以保存省,区,公社和村庄的选定ID。然后是table2,其中包含省,区,公社和村庄的ID和名称。省和地区是必填字段,并且将始终填写。公社和村庄可能会被填补,但可能不会被填补,因为它们不是必需的。

构建动态SQL语句的最佳方法是什么,而不知道是否在表1中填写了公社和村庄的ID。

SELECT tbl1.province, tbl1.district, tbl1.commune, tbl1.village 
  FROM dbo.table1 AS tbl1 
   AND dbo.table2 AS tbl2 
 WHERE tbl1.province = tbl2.province_id
   AND tbl1.district = tbl2.district_id 
   AND tbl1.commune = tbl2.commune_id 
   AND tbl1.village = tbl2.village_id

如果未填充table1中的id,则此语句会产生错误的结果。

1 个答案:

答案 0 :(得分:4)

OUTER JOIN在这里不起作用,因为您不希望拥有table2中的所有元素,而只需要表1中存在相应元素的元素。

你会想做这样的事情:

SELECT tbl1.province, tbl1.district, tbl1.commune, tbl1.village 
FROM dbo.table2 AS tbl2 
INNER JOIN dbo.table1 AS tbl1
ON tbl1.province = tbl2.province_id 
AND tbl1.district = tbl2.district_id 
AND (tbl1.commune is NULL OR (tbl1.commune = tbl2.commune_id)) 
AND (tbl1.village is NULL OR (tbl1.village = tbl2.village_id))