使用WHERE NOT EXISTS

时间:2017-06-07 20:58:45

标签: sql sql-server

我正在努力创造一个简单的WHERE NOT EXISTS条款。假设以下示例

CREATE TABLE #TempUser ( TempUserId INT, TempUserName VARCHAR(50) )

CREATE TABLE #TempData ( TempDataId INT, TempDesc VARCHAR(50) )

CREATE TABLE #TempUserData ( TempUserId INT, TempDataId INT )

INSERT #TempUser ( TempUserId, TempUserName )
VALUES  ( 1, 'Paul' ),
        ( 2, 'Franics' ),
        ( 3, 'Raj' )

INSERT #TempData ( TempDataId, TempDesc )
VALUES  ( 1, 'Test Exists'),
        ( 2, 'Test Not Exists')

INSERT #TempUserData ( TempUserId, TempDataId )
VALUES  ( 1, 1 ),
        ( 1, 2 ),
        ( 2, 1 )

SELECT TU.TempUserId
FROM 
    #TempUser AS TU
    LEFT JOIN #TempUserData AS TUD ON TUD.TempUserId = TU.TempUserId
WHERE 
    NOT EXISTS (SELECT * FROM #TempData AS TD WHERE TD.TempDataId = TUD.TempDataId AND TD.TempDesc LIKE '%Not%')

我要做的就是从#TempUser表中获取没有特定数据记录的用户列表,在这种情况下 测试不存在 。预期的结果集是UserId 2和3,因为你可以看到执行上面的操作会得到1,2和3.所以那里的任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:0)

我认为这就是你想要的:

select TU.TempUserId
from #TempUser as TU
where not exists (
  select 1
  from #TempData as TD
    inner join #TempUserData as TUD 
      on TD.TempDataId = TUD.TempDataId
  where TUD.TempUserId = TU.TempUserId 
    and TD.TempDesc like '%Not%'
  )

rextester演示:http://rextester.com/JJDTM34255

返回:

+------------+
| TempUserId |
+------------+
|          2 |
|          3 |
+------------+

答案 1 :(得分:0)

我希望这样的事情:

2017-06-16 08:00:25 +0000

我怀疑您的问题是用户1的第一行(SELECT TU.TempUserId FROM #TempUser TU WHERE NOT EXISTS (SELECT 1 FROM #TempUserData TUD JOIN #TempData TD ON TD.TempDataId = TUD.TempDataId WHERE TUD.TempUserId = TU.TempUserId AND D.TempDesc LIKE '%Not%' ); 的第一行)符合TempDataId = 1条件。

答案 2 :(得分:0)

稍微修改现有查询,再添加一个left join和聚合。

SELECT TU.TempUserId
FROM #TempUser AS TU
LEFT JOIN #TempUserData AS TUD ON TUD.TempUserId = TU.TempUserId
LEFT JOIN #TempData AS TD ON TD.TempDataId = TUD.TempDataId AND TD.TempDesc LIKE '%Not%'
GROUP BY TU.TempUserId
HAVING COUNT(TD.TempDesc) = 0