我是xquery的新手(来自sql),我正在尝试编写一个查询来选择其他表中不存在的所有结果。
更具体地说,我使用的是这个xml数据库:https://www.dbis.informatik.uni-goettingen.de/mondial/mondial.xml 我正在努力选择所有没有岛屿的国家
xml查询:
let $islands := doc("mondial.xml")/mondial/island/located/data(@country)
for $country in doc("mondial.xml")/mondial/country
let $c_code := $country/data(@car_code)
let $c_name := data($country/name)
where not($c_code=$islands)
order by $c_name
return $c_name
相同的查询,但在sql中:
SELECT name
FROM Country
WHERE code
NOT IN (SELECT country FROM geo_island);
(等效sql数据库的关系模式:https://www.dbis.informatik.uni-goettingen.de/mondial/mondial-rs.pdf )
在我的结果中,正确的国家数应该是120个,但是我得到的却是210个国家。我做错了什么?
编辑:如果我之前没有说清楚:我在编写xquery查询之前编写了sql查询。我只是尝试将sql查询转换为xquery查询。
1条答案
按热度按时间idv4meu81#
岛屿所在的国家
/mondial/island/@country
,不在/mondial/island/located/@country
. 例如,请参见爱尔兰的条目:爱尔兰国家和英国(即北爱尔兰)都在爱尔兰岛上,因此在该岛上有两个空格分隔的条目
/mondial/island[name = 'Ireland']/@country
.你可以用
fn:tokenize($string[, $separator])
获得所有单一国家和(性能)获得所有独特的岛屿国家与fn:distinct-values($sequence)
. 其余的可以保持不变:现在,120个国家如期返回。