我试图质疑表中的产品标准。 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;
答案 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;
除非您还有其他条件要添加。