有没有办法积极地写这个查询?或者至少更清楚?

时间:2014-05-23 22:27:39

标签: sql

我想选择描述,其中所有关联的ITEM都在另一个表中。

一个表将说明与ITEM相关联:

DESCRIPTION   ITEM
mouse         item1
mouse         item2
keyboard      item3

另一个列出了ITEM。 (关于他们的数据我在这里)

ITEMS   ...   ...
item1
item2
item3

我的查询很慢并且包含双重否定。

select distinct A.DESCRIPTION
from   DESCRIPTION_TO_ITEM_TABLE A
where  A.DESCRIPTION not in (select distinct B.DESCRIPTION
                           from DESCRIPTION_TO_ITEM_TABLE B
                            where B.ITEM not in (select distinct C.ITEM from ITEM_TABLE C))

基本上,它是在说 选择描述,其中描述不在那些项目不在项目表

中的描述中

换句话说,选择的描述将项目表中的所有项目都包含在内。

有没有办法明确地编写该查询?

3 个答案:

答案 0 :(得分:2)

如果我正确理解了这个问题,你想要一个项目与描述相交的所有记录

Select description
from descriptions d
inner join items  i
on i.items = d.item

如果这是你之后的......我强烈鼓励  以下阅读:http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/

但是也许你说如果描述鼠标......有2个项目而且其中一个没有出现在项目表中你不想看到它...... < / p>

子查询,以获取不具备所有项目的说明。 然后选择获取不在该列表中的描述。

Select description from description where description not in (
Select description 
from descriptions d
left join items i
on i.items = d.item
where i.item is null)

子查询以获取缺少项目的描述 然后返回子查询并仅返回那些不在该列表中的记录。

Select c.description 
from description c
LEFT JOIN (Select description 
from descriptions d
left join items i
on i.items = d.item
where i.item is null) B on B.Description = c.description
and B.Description is null

答案 1 :(得分:2)

您可以离开加入ITEM_TABLE,然后将尝试的匹配次数与实际匹配次数进行比较:

select DESCRIPTION_TO_ITEM_TABLE.DESCRIPTION
from DESCRIPTION_TO_ITEM_TABLE
left join ITEM_TABLE
on ITEM_TABLE.ITEM = DESCRIPTION_TO_ITEM_TABLE.ITEM
group by DESCRIPTION_TO_ITEM_TABLE.DESCRIPTION
having count(ITEM_TABLE.ITEM) = count(DESCRIPTION_TO_ITEM_TABLE.ITEM)

答案 2 :(得分:0)

在项目或说明表格中添加一个字段会告诉您是否包含所有项目会不会更有效。