sql查询正确吗?

时间:2019-04-12 01:53:28

标签: mysql sql

我试图质疑表中的产品标准。 NAME和VAL值位于不同的行中。 我怀疑记录是否等于NAME = aa,bb,cc 、。 VAL = 10,20,30。 我正在取得结果。我认为SQL查询工作正常。 我可以使用以下方法更正查询列。

但是我认为这是错误的。从性能方面来看,此SQL查询是否正确?如果没有,您可以举一个正确的SQL查询示例吗?谢谢您的帮助。

test table:

Id  PID NAME VAL
1   1   aa   10
2   1   bb   20
3   1   cc   30

4   2   aa   10
5   2   bb   20
6   2   cc   30

7   3   aa   10
8   3   bb   20
9   3   cc   999



Query:

SELECT PID from test WHERE
PID IN (SELECT PID FROM test WHERE NAME='aa' and VAL='10')
AND
PID IN (SELECT PID FROM test WHERE NAME='bb' and VAL='20')
AND
PID IN (SELECT PID FROM test WHERE NAME='cc' and VAL='30')
GROUP BY (PID)



Result:

1
2

我正在考虑将其与此类(<> =)运算符一起使用。这是最终结果。我想让你发表评论。

SELECT t.pid from test t 
WHERE
(t.name = 'aa' and t.val = 10)
OR 
(t.name = 'bb' and t.val = 20) 
OR 
(t.name = 'cc' and t.val > 30) 
GROUP BY t.pid 
HAVING count(t.pid) = 3;

3 个答案:

答案 0 :(得分:1)

您也可以写

SELECT a.PID
FROM   test a, test b, test c
WHERE  (a.NAME = 'aa' AND a.VAL = '10') AND
       (b.NAME = 'bb' AND b.VAL = '20') AND
       (c.NAME = 'cc' AND c.VAL = '30') AND
       (a.PID = b.PID AND b.PID = c.PID);

我不太确定性能,因为查询优化器可能会将这两者都减少到同一查询中,但是它的性能应该不会比您当前的查询差。

答案 1 :(得分:1)

我建议为此目的进行汇总。假设您没有名称/值重复项,那么:

select t.pid
from test t
where (t.name, t.val) in ( ('aa', '10'), ('bb', '20'), ('cc', '30') )
group by t.pid
having count(*) = 3;

如果可以重复,请使用:

having count(distinct t.name, t.val)

答案 2 :(得分:0)

您的查询基本上与此类似:

SELECT PID 
FROM test 
WHERE NAME IN ('aa','bb','cc') 
AND VAL IN ('10','20','30')
GROUP BY PID;

除非您还有其他条件要添加。