首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多值属性的sql查询

多值属性的sql查询
EN

Stack Overflow用户
提问于 2015-01-19 16:48:25
回答 3查看 554关注 0票数 1

我有每个由guid表示的资源,它们有属性名称-值对。我想查询具有给定属性名值对的资源。

所以,假设这个表看起来像:

代码语言:javascript
复制
GUID                                      ATTR_SUBTYPE        ATTR_VAL 
63707829116544a38c5a508fcde031a4            location            US 
63707829116544a38c5a508fcde031a4            owner               himanshu       
44d5bf579d9f4b9a8c41429d08fc51de            password            welcome1 
44d5bf579d9f4b9a8c41429d08fc51de            host                retailHost       
c67d8f5d1a9b41428f029d55b79263e1            key                 random 
c67d8f5d1a9b41428f029d55b79263e1            role                admin 

我要把所有的资源都定位为美国和业主作为奥拉夫。

一个可能的查询是:

select guid from table where attr_subtype = 'location' and attr_value = ‘US' INTERSECT select guid from table where attr_subtype = 'owner' and attr_value = ‘himanshu';

查询中可以有任意数量的属性名值对,因此在查询中每对有一个额外的交集。我想知道我们是否可以构造一个更好的查询,因为交叉非常昂贵。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-19 18:10:38

假设每个GUID没有重复的属性,那么不需要JOIN就可以达到预期的结果

代码语言:javascript
复制
SELECT "GUID" FROM T
WHERE ( "ATTR_SUBTYPE" = 'location' AND "ATTR_VAL" = 'US' )
OR    ( "ATTR_SUBTYPE" = 'owner' AND "ATTR_VAL" = 'himanshu' )
GROUP BY "GUID"
HAVING COUNT(*) = 2 -- <-- keep only GUID have *both* attributes

请参阅http://sqlfiddle.com/#!4/80900/2

票数 2
EN

Stack Overflow用户

发布于 2015-01-19 17:00:30

将目标插入临时表,然后加入到其中。

代码语言:javascript
复制
select t.guid 
from table as t 
join temp
on t.attr_subtype = temp.attr_subtype
and t.attr_value = temp.attr_value 
票数 1
EN

Stack Overflow用户

发布于 2015-01-19 17:00:54

一般来说,连接比这里的相交更好。它提供了一个机会,以获得第一次记录之前,几个完整的表扫描将完成。但是无论如何,您选择了一个缓慢的数据结构,这样如果它减速,它就不会很好了。

试着做些像

代码语言:javascript
复制
select * 
from 
  (select * from table where attr_subtype = 'location' and attr_value = 'US') t1 
    join
  (select * from table where attr_subtype = 'owner' and attr_value = 'himanshu') t2
    on (t1.guid = t2.guid)
  ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28029650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档