2013-03-20 29 views
1

请考虑下面的MySQL表Selectig与存在,只有当另一列已得到只是某些值

|----+--------+----------| 
| id | result |reference | 
|----+--------+----------| 
| 1 |ok  |  33 | 
| 2 |ok  |  46 | 
| 3 |ko  |  55 | 
| 4 |ko  |  55 | 
| 5 |ok  |  55 | 
| 6 |ko  |  47 | 
| 7 |ko  |  89 | 
| 8 |ok  |  91 | 
| 9 |ko  |  47 | 
+----+--------+----------+ 

我要选择,其结果= KO和基准= 47,因为该行的列值的行参考文献47不存在于结果=确定的任何行中。除此之外,我只需要一次该行,因为这种情况会发生两次(id = 6和id = 9),尽管它可能会发生一次。事实上,在我所要求的查询中,id = 89的行也应该显示为reference = 89,result = ko,并且没有其他行的reference = 89和result = ok。 非常感谢您提前!

回答

1

你可以使用一个subquery with not exists

SELECT DISTINCT result, reference 
FROM [dbo].[references] as x 
WHERE NOT EXISTS 
(SELECT * FROM [dbo].[references] as y 
WHERE 
y.reference = x.reference 
and 
y.result = 'ok'); 

你也可以使用自左做加盟:

SELECT DISTINCT x.result, x.reference 
FROM [dbo].[references] as x 
LEFT JOIN 
[dbo].[references] as y 
on x.reference = y.reference 
and y.result = 'ok' 
WHERE 
y.reference IS NULL 
+0

Thaks很多,杜加斯!我认为你以前给我的第一个解决方案是可以的。我的意思是... SELECT DISTINCT estado,referencia FROM envios WHERE NOT EXISTS(SELECT * FROM envios AS tableA2 WHERE envios.estado ='exito')但是现在想象一下,我只有三个列,而不是只有三个列,我想要全部检索它们。我怎么能这样做。在你刚才提到的查询中,你只需要检索两列,但我想要全部七列。感谢您花时间帮助我。对此,我真的非常感激! – Rodolfo 2013-03-20 22:13:13

+0

只需将它们添加到第一个选择。 – dugas 2013-03-20 22:28:14

+0

谢谢duga,它工作完美。我使用第二个选项,结果正是我需要的!再次感谢! – Rodolfo 2013-03-21 11:01:34

0

使用条件,东西的效果:

IF EXISTS (Select TOP 1 * from <thistable> 
WHERE result='OK' AND reference=47) 
SELECT Select TOP 1 * from <thistable> 
WHERE result='OK' AND reference=47 
ELSE 
SELECT Select TOP 1 * from <thistable> 
WHERE result='KO' AND reference=47 
END 
+0

Hi Voices,谢谢你的时间。杜加的第二个选择恰恰是我所期待的。问候! – Rodolfo 2013-03-21 11:02:36