2011-04-13 88 views
2

是否有内联sql命令与intersect类似或产生相同的结果?如果没有,有没有办法重写查询,所以它在一个查询中,而不是使用intersectSQL在线等效于相交

我现在的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

你的第二个查询实际上是否返回任何数据?当然,'cs.classselection_link'不能等于1和95,这实际上是你在第二个查询中要求的。 – 2011-04-13 16:07:11

+0

是的,基本上classValues持有class_link和classSelection_link。它基本上是一个多对多的关系,我希望所有的类都可以联系两个传入的classSelections。 – lancscoder 2011-04-13 16:10:49

+3

为什么你不想使用'INTERSECT'?它存在的一个原因,那就是你的情况。 还有其他的方法来编写查询,但是它们会比在你的例子中使用'INTERSECT'要少得多。 是否有你想混淆代码的原因? – JNK 2011-04-13 16:24:18

回答

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)在表ClassValuesUNIQUE

如果事实并非如此,那么在最后2个查询HAVING子句应改为:

HAVING 
    COUNT(DISTINCT cv.ClassSelection_Link) = 2 
+0

如果在JOIN中有3行classselection_link = 95,该怎么办?应该是COUNT(DISTINCT cs.classselection)= 2',否? – gbn 2011-04-13 18:16:21

+0

@gbn:你说得对,我认为'(Class_Link,ClassSelection_Link)'是'ClassValues'表中的'UNIQUE'。无论如何你的改正工作。 – 2011-04-13 18:57:09

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 
+0

谢谢,但独特的不起作用。我希望它返回所有与95和1关联的Log_links,而DISTINCT则返回所有的log_links,只是删除任何重复项。 – lancscoder 2011-04-13 16:14:55

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 
2

INTERSECT并存是相同的语义。而且你不需要这么多表

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)