我有这样的表(示例而且只是其中的一部分):
node_id | k | v
123 | addr:housenumber | 50
123 | addr:street | Kingsway
123 | addr:city | London
123 | (some other stuff) | .....
100 | addr:housenumber | 121
100 | addr:street | Edmund St
100 | addr:city | London
我想在此表中找到使用一个查询,如果存在例如伦敦,Kingsway 50和它的node_id是什么。如何进行此类查询甚至可能?如何处理这样的问题?
伪代码:
SELECT node_id WHERE (k == 'addr:city') == 'London' AND (k == 'addr:street') == 'Kingsway' AND (k == 'addr:housenumber') == '50' AND for all node_id the same
数据库架构:http://pastebin.com/Yigjt77f,我的表node_tags。
答案 0 :(得分:0)
你可以使用这样的自联接:
SELECT n1.node_id FROM node_tags n1
INNER JOIN node_tags n2 ON n1.node_id = n2.node_id
INNER JOIN node_tags n3 ON n1.node_id = n3.node_id
WHERE n1.k = 'addr:housenumber' AND n1.v = '50'
AND n2.k = 'addr:street' AND n2.v = 'Kingsway'
AND n3.k = 'addr:city' AND n3.v = 'London'
使用PostgreSQL可能有更好的方法,但我不熟悉DBMS。
示例SQL Fiddle。