2013-03-05 121 views
2

我有表A作为 | name1 | name2 | value |试图避免重复查询

表B为|名|值|。

这里的“名1”,并在表A“NAME2”属性外键的表B中引用的“名”

现在我想有一个查询功能是这样的:

SELECT value FROM A WHERE name1 IN 
    (SELECT name FROM B WHERE value = '1') AND 
    name2 IN (SELECT name FROM B WHERE value = '1') 

这里的问题是,如果我不喜欢它上面的代码中,将有来自表B.两个查询,其实我只需要一个查询,有没有在SQL任何这样写道

SELECT value FROM A WHERE name1,name2 IN (SELECT name FROM B WHERE value = '1') 

而如果我想要这样的东西:

SELECT value FROM A WHERE name1,name2 IN 
    (SELECT name FROM B ORDER BY value DESC FETCH FIRST 200 ROWS ONLY) 

+0

你正在使用什么数据库系统? – 2013-03-05 09:16:24

回答

0

可以加入吗?

select value from A inner join table b b1 on a.name1 = b1.name inner join table b b2 on a.name2 = b2.name where b1.name = '1' and b2.name = '1'

+0

这里我的问题是,A和B都非常大,如果我可以从B中首先选择,将会有更少的元组,那么加入这里仍然会影响性能? – faz 2013-03-05 04:27:35

+0

它是否必须是纯粹的查询?你能把它包装在一个函数或程序中吗?在那种情况下,你可以声明一个临时表,并加入这个表? '声明@tbl表(名字nvarchar);插入@tbl从B中选择前200名;从A中选择名称,其中名称1(从@tbl中选择名称)和名称2(从@tbl中选择名称)' – AndrewP 2013-03-05 21:44:50

0

您可以使用加入这样SELECT A.value FROM A inner join B on A.name1 = B.name inner join B on A.name2 = B.name where B.name in ('1')

+0

我的问题在于A和B都非常大,如果我可以先从B中选择,少得多的元组,加入这里仍然会影响性能? – faz 2013-03-05 04:32:09

+0

我认为联接比您使用的多级查询更快。 – 2013-03-05 04:43:59

0
select name, value from b 
left outer join (select name1 from a where value = '1') as a1 on 
a1.name1 = b.name 
left outer join (select name2 from a where value = '1') as a2 on 
a2.name2 = b.name 
where value is not null 
/*omit null from left outer join for names not in table b*/ 
0

在SQLServer2005的+,你可以使用带有NOT EXISTS + EXCEPT运营商

SELECT A.value 
FROM A 
WHERE NOT EXISTS (     
        SELECT A.name1 
        UNION 
        SELECT A.name2     
        EXCEPT 
        SELECT B.name 
        FROM B 
        WHERE B.value = '1'     
        ) 

SQLFiddle

0

演示选项创建表B中的视图,并使用它呢?

Create view B_LIMITED AS SELECT name FROM B WHERE value = '1' 

select value from A inner join table b_limited b1 on a.name1 = b1.name inner join table b_limited b2 on a.name2 = b2.name where b1.name = '1' and b2.name = '1'