CREATE TABLE #A(CD VARCHAR(20), [Name] VARCHAR(20))
INSERT #A
SELECT 'A1', 'a'
UNION ALL
SELECT 'A1', 'b'
UNION ALL
SELECT 'A1', 'c'
UNION ALL
SELECT 'A2', 'b'
UNION ALL
SELECT 'A2', 'c'
UNION ALL
SELECT 'A2', 'd'
UNION ALL
SELECT 'A3', 'a'
UNION ALL
SELECT 'A3', 'b'
UNION ALL
SELECT 'A3', 'd'
UNION ALL
SELECT 'A4', 'a'
UNION ALL
SELECT 'A4', 'c'
UNION ALL
SELECT 'A4', 'd'CREATE TABLE #B([Name] VARCHAR(20))
INSERT #B
SELECT 'a'
UNION ALL
SELECT 'c'SELECT
A.CD
FROM
#A A
INNER JOIN
#B B
ON
A.NAME = B.NAME
GROUP BY
A.CD
HAVING
COUNT(*) >= 2以上是我的SQL。
同事写了以下的...不考虑效率方面的问题...
单看代码...怎么也理解不了这段SQL的含义...
拜托大家帮忙解释这两层NOT EXISTS嵌套...SELECT DISTINCT
A.CD
FROM
#A A
WHERE NOT EXISTS
(
SELECT
*
FROM
#B B
WHERE NOT EXISTS
(
SELECT
*
FROM
#A
WHERE
CD = A.CD
AND
[NAME] = B.NAME
)
)

解决方案 »

  1.   

    SELECT DISTINCT 
    A.CD 
    FROM 
    #A A 
    WHERE
     NOT EXISTS 

    SELECT * FROM #B B WHERE
     NOT EXISTS 
    ( SELECT * FROM #A WHERE CD = A.CD AND [NAME] = B.NAME ) 
    )
    子查询里面嵌套了一个子查询,还用怎么解释,多理解理解 not exists就是了
      

  2.   

    SELECT DISTINCT A.CD 
    FROM #A A 
    WHERE NOT EXISTS (
    SELECT  * 
    FROM #B B 
    WHERE NOT EXISTS (
    SELECT  * 
    FROM #A 
    WHERE CD = A.CD --这里有问题吧,这一层已经不认识A表了.
    AND [NAME] = B.NAME 

    )
      

  3.   

    --EXISTS:指定一个子查询,检测行的存在。 
    --本示例所示查询查找由位于以字母 B 开头的城市中的任一出版商出版的书名:
    SELECT DISTINCT pub_name FROM publishers WHERE EXISTS (SELECT * FROM titles WHERE pub_id = publishers.pub_id AND type = 'business')
    SELECT distinct pub_name FROM publishers WHERE pub_id IN (SELECT pub_id FROM titles WHERE type = 'business')
    --两者的区别:
    --EXISTS:后面可以是整句的查询语句如:SELECT * FROM titles
    --IN:后面只能是对单列:SELECT pub_id FROM titlesNOT EXISTS:
    --例如,要查找不出版商业书籍的出版商的名称:
    SELECT pub_name FROM publishers WHERE NOT EXISTS (SELECT * FROM titles WHERE pub_id = publishers.pub_id AND type = 'business')
    --下面的查询查找已经不销售的书的名称:
    SELECT title FROM titles WHERE NOT EXISTS (SELECT title_id FROM sales WHERE title_id = titles.title_id)
    PS:
    存在不存在绕来绕去的
    多做测试你就明白了,比别人给你讲体会深刻,
      

  4.   

    示例中的not exists 脚本存在问题。
    最外一层嵌套 没有关联关系!!
      

  5.   

    http://blog.csdn.net/lihan6415151528/archive/2009/08/20/4466914.aspx
      

  6.   

    意义跟你写的不一样
    他的意思是A表中同一CD,必须有B表中的所有记录,因为B表中只有两条记录,你的条件是count(*) >= 2,所以结果一样
    如果B表里插入一条记录'd'或者'd',再执行一下就不同了
      

  7.   

    嗯,如果继续往B表中插入数据...那么相应的count(*) >= 3 这里的2就要变成3了..