我需要一个查询来选择所有这些没有重复另一个值的条目。我将在下一行解释这个案例。
我有一张物品和价值表。每个项目都可以使用不同的值重复。让我们说我在表B中有以下记录集:
item_id value type_value
ID Item A 0 0
ID Item B 0 0
ID Item A 1 0
ID Item C 1 1
这些项目,正如您已经猜到的那样,是ID,因此"原始"包含其信息的项目位于另一个表格中。我想要做的是从"原始"中选择。列出我在第二个表格中解释过的那些项目。
正如我之前介绍的那样,我需要从表A中选择所有那些ID在表B中的项目,但只有那些值设置为0并且没有其他记录被设置为1且具有相同类型的& #34; type_value&#34 ;.
由于"原创" table,我需要在带有INNER SELECT的WHERE子句中这样做。在这种情况下,输出的结果将是:
item_id value type_value
ID Item B 0 0
ID Item C 1 1
如果我们决定只选择具有指定type_value的那些,我知道如何做到这一点,所以不要担心。
我能够这样做,至少差不多。当我有相同的item_id和不同的值字段时,我的问题出现了,所以当我试图说" WHERE值!= 1"时,这仍然被选中,因为还有另一个值为0的记录。
如何在主查询的WHERE子句中的内部选择中选择我喜欢的行,而不必使用NOT IN重复整个SELECT并添加" WHERE值= 1"排除那些有价值的人?
因为它可能是一个冗长而复杂的查询(主要问题),所以我希望尽可能简单。当然,正如我之前所说的,我可以复制整个查询并选择那些值设置为我不想要的那个,然后放入一个" AND NOT IN"在SELECT之前。但那重复的代码,我认为性能可能会受到影响。
感谢你们所有人的时间!
如果您需要进一步说明,请告诉我们!
表-A
+----+--------+
| id | name |
+----+--------+
| 1 | Item A |
+----+--------+
| 2 | Item B |
+----+--------+
| 3 | Item C |
+----+--------+
表-B
+---------+-------+
| item_id | value |
+---------+-------+
| 1 | 0 |
+---------+-------+
| 2 | 0 |
+---------+-------+
| 1 | 1 |
+---------+-------+
| 3 | 1 |
+---------+-------+
示例查询
SELECT name
FROM Table_A
WHERE id IN (SELECT item_id
FROM Table_B
WHERE "item_value is equal to 0 and no other row has this item_id with a item_value different from 0")
结果查询
+---------+
| name |
+---------+
| Item B |
+---------+
答案 0 :(得分:1)
您可以使用GROUP BY
和HAVING
来完成此操作,例如:
SELECT a.*, b.itemid, SUM(b.value) AS vc FROM tableb b
INNER JOIN tablea a ON a.itemid = b.itemid
GROUP BY b.item_id
HAVING vc = 0
答案 1 :(得分:0)
我使用非常简单的查询结构让您了解解决方案。 可能有更好的查询来完成这项工作。
这里是:
首先,您需要获取您不希望出现的行:
这是如何完成的:
SELECT item_id,COUNT(item_id) how_many FROM my_table GROUP BY item_id HAVING (how_many>1)
现在您需要从表中选择item_id未出现在上述查询中的行,它是这样完成的:
SELECT T1.item_id,T1.value,T1.type_value
FROM my_table T1
WHERE (T1.item_id not in (SELECT T.item_id from (SELECT item_id,COUNT(item_id) how_many FROM my_table GROUP BY item_id HAVING (how_many>1))T ))
你可以看到我使用了"而不是"运算符和我命名前一个结果表 - T
确保您了解上述内容 询问您是否需要更多信息