Как построить оператор SQL с использованием идентификаторов, которые могут быть недоступны в таблице? - PullRequest
3 голосов
/ 31 мая 2011

Используя Microsoft SQL Server 2008, скажем, есть таблица1, в которой хранятся выбранные идентификаторы провинций, районов, коммун и деревень.И затем есть таблица2 с идентификаторами и названиями провинций, районов, коммун и деревень.Провинции и районы являются обязательными полями и всегда будут заполнены.Коммуны и деревни могут быть заполнены, но могут даже не заполняться, поскольку они не обязательны.

Каков наилучший способ построения динамического оператора SQL, не зная, заполнены ли идентификаторы для коммун и деревень в таблице1 или нет.

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

Этот оператор дает неверные результаты, если идентификатор в таблице1 не заполнен.

1 Ответ

4 голосов
/ 31 мая 2011

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))
...