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

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

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

在不知道公社和村庄的 ID 是否填入表 1 的情况下构建动态 SQL 语句的最佳方法是什么。

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 没有被填充,这个语句会给出错误的结果。

最佳答案

OUTER JOIN 在这里不起作用,因为您不想拥有表 2 中的所有元素,而只想要那些在表 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))

关于sql - 如何使用表中可能不可用的 ID 构建 SQL 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6185987/

相关文章:

sql - 数据库脚本按版本打包

c# - 在我的应用程序中手动生成 guid 还是让 sql server/azure sql 为我生成它更好

SQL Server 其中 start_date 和 End_date 之间的日期

sql-server - 带有 varbinary 右侧运算符的 TSQL vbinary 位掩码

php - SQL查询调试

php - 使用 sql LIKE 来匹配完整的单词

mysql - SQL 类似带有附加字符

SQL计算已知时期内的不同时间范围

sql - 在部署时将大量数据导入 SQL Server (Express) 数据库

sql - SQL Server对float字段的“喜欢”产生不一致的结果