是否有与intersect
类似或产生相同结果的内联sql命令?如果没有,是否有办法重写查询,使其在一个查询中而不是使用intersect
?
我当前的SQL查询是:
SELECT
c.Log_Link
FROM
Classes c INNER JOIN
ClassValues cv ON c.Class_Link = cv.Class_Link INNER JOIN
ClassSelection cs ON cv.ClassSelection_Link = cs.ClassSelection_Link
WHERE
cs.classselection_link IN (95,1)
但我真正追求的是:
SELECT
c.Log_Link
FROM
Classes c INNER JOIN
ClassValues cv ON c.Class_Link = cv.Class_Link INNER JOIN
ClassSelection cs ON cv.ClassSelection_Link = cs.ClassSelection_Link
WHERE
cs.classselection_link = 95
INTERSECT
SELECT
c.Log_Link
FROM
Classes c INNER JOIN
ClassValues cv ON c.Class_Link = cv.Class_Link INNER JOIN
ClassSelection cs ON cv.ClassSelection_Link = cs.ClassSelection_Link
WHERE
cs.classselection_link = 1
由于
答案 0 :(得分:2)
可能正在使用内部联接...
SELECT
*
FROM
(
SELECT
c.Log_Link
FROM
Classes c INNER JOIN
ClassValues cv ON c.Class_Link = cv.Class_Link INNER JOIN
ClassSelection cs ON cv.ClassSelection_Link = cs.ClassSelection_Link
WHERE
cs.classselection_link = 95
) T1
INNER JOIN
(
SELECT
c.Log_Link
FROM
Classes c INNER JOIN
ClassValues cv ON c.Class_Link = cv.Class_Link INNER JOIN
ClassSelection cs ON cv.ClassSelection_Link = cs.ClassSelection_Link
WHERE
cs.classselection_link = 1
) T2
ON
T1.Log_Link = T2.Log_Link
答案 1 :(得分:2)
你总是可以这样做:
SELECT DISTINCT
c.Log_Link
FROM
Classes c INNER JOIN
ClassValues cv1 ON c.Class_Link = cv1.Class_Link INNER JOIN
ClassSelection cs1 ON cv1.ClassSelection_Link = cs1.ClassSelection_Link
INNER JOIN
ClassValues cv2 ON c.Class_Link = cv2.Class_Link INNER JOIN
ClassSelection cs2 ON cv2.ClassSelection_Link = cs2.ClassSelection_Link
WHERE
cs1.classselection_link = 95
AND
cs2.classselection_link = 1
或 GROUP BY :
SELECT
c.Log_Link
FROM
Classes c INNER JOIN
ClassValues cv ON c.Class_Link = cv.Class_Link INNER JOIN
ClassSelection cs ON cv.ClassSelection_Link = cs.ClassSelection_Link
WHERE
cs.classselection_link IN (95,1)
GROUP BY
c.Class_Link
HAVING
COUNT(c.Class_Link) = 2
因为你真的不需要ClassSelection
表:
SELECT
c.Log_Link
FROM
Classes c INNER JOIN
ClassValues cv ON c.Class_Link = cv.Class_Link
WHERE
cv.ClassSelection_Link IN (95,1)
GROUP BY
c.Class_Link
HAVING
COUNT(c.Class_Link) = 2
正如gbn指出的那样,我假设表(Class_Link, ClassSelection_Link)
中UNIQUE
为ClassValues
。
如果不是这样,那么最后2个查询中的HAVING子句应该更改为:
HAVING
COUNT(DISTINCT cv.ClassSelection_Link) = 2
答案 2 :(得分:2)
INTERSECT和EXISTS在语义上是相同的。而且你不需要那么多表
SELECT
c.Log_Link
FROM
Classes c
WHERE
EXISTS (
SELECT * FROM ClassValues cv
WHERE c.Class_Link = cv.Class_Link AND cv.classselection_link = 95)
AND
EXISTS (
SELECT * FROM ClassValues cv
WHERE c.Class_Link = cv.Class_Link AND cv.classselection_link = 1)
答案 3 :(得分:1)
我很确定你只想要与众不同。您正在尝试获得一组符合任一条件的唯一c.Log_Link,对吗?如果是这样的话:
SELECT DISTINCT
c.Log_Link
FROM
Classes c INNER JOIN
ClassValues cv ON c.Class_Link = cv.Class_Link INNER JOIN
ClassSelection cs ON cv.ClassSelection_Link = cs.ClassSelection_Link
WHERE
cs.classselection_link IN (95,1)
编辑:我看到你的澄清了。我认为加入派生表作为amit_g建议是可行的方法。
我稍微调整了一下:
SELECT
c.Log_Link
FROM
Classes c INNER JOIN
ClassValues cv ON c.Class_Link = cv.Class_Link INNER JOIN
ClassSelection cs ON cv.ClassSelection_Link = cs.ClassSelection_Link
INNER JOIN (
SELECT
c.Log_Link
FROM
Classes c INNER JOIN
ClassValues cv ON c.Class_Link = cv.Class_Link INNER JOIN
ClassSelection cs ON cv.ClassSelection_Link = cs.ClassSelection_Link
WHERE
cs.classselection_link = 1
) T2 ON c.Log_Link = T2.Log_Link
WHERE
cs.classselection_link = 95