我能想到两种可能的解决方案。
首先你做一个加入到子查询,而不是使用IN子句
SELECT tab.col1,
tab.col2,
tab.col3
FROM tab
INNER JOIN
(
SELECT col1
FROM tab
WHERE col3 IN (1,2,3,4)
AND col4 = 10
GROUP BY col1
HAVING COUNT(DISTINCT col3) = 4
) sub0
ON tab.col1 = sub0.col1
WHERE col2 > 1234
AND col2 < 9876
AND col3 IN (1,2,3,4)
AND col1 IN
取决于匹配的数量等,这可能是更有效的。
可能效率更高但灵活性更低的方法是将col3的每个特定值与您需要的col4值相加来回到表格。如果有任何遗漏,则排除连接结果。不好的一面是你需要在SELECT上使用DISTINCT来删除重复项。
SELECT DISTINCT tab0.col1,
tab0.col2,
tab0.col3
FROM tab AS tab0
INNER JOIN tab AS tab1 ON tab0.col1 = tab1.col1 AND tab1.col3 = 1 AND tab1.col4 = 10
INNER JOIN tab AS tab2 ON tab0.col1 = tab2.col1 AND tab2.col3 = 2 AND tab2.col4 = 10
INNER JOIN tab AS tab3 ON tab0.col1 = tab3.col1 AND tab3.col3 = 3 AND tab3.col4 = 10
INNER JOIN tab AS tab4 ON tab0.col1 = tab4.col1 AND tab4.col3 = 4 AND tab4.col4 = 10
WHERE tab0.col2 > 1234
AND tab0.col2 < 9876
AND tab0.col3 IN (1,2,3,4)
由于您在内部选择中使用GROUP BY和HAVING,因此很可能无法使用JOIN写入此查询。 – Galz