SQL Server:一次检查2个表

时间:2015-09-07 15:54:39

标签: sql sql-server loops join

好的,所以我要做的基本上是在一个查询中检查2个表,一个用于查看该帐户是否启用了标志,然后检查是否有任何具有启用标志的帐户为零评级(负评级可以忽略)

所以我基本上有2张桌子

表:Accounts

AccountId       Flag
--------     ---------
0001             1
0002             1
0003             0
0004             0
0005             0
0006             1
0007             1
0008             1
0009             1

表:Ratings

Accountid   Rating 
-------     --------
001         -1
001          3
001         -5
002          2
002          3
002          7
005          3
005          5
008          4
009         -4
009         -5

我可以检查第一张表并轻松获得带有标志的ID

select AccountId 
from Accounts 
where Flag = 1;

|  Account ID |  
---------------
|    001      |
|    002      |
|    006      |
|    007      |
|    008      |
|    009      |

然后我遇到麻烦只检查查询的结果,找出哪一个没有任何正面评价

如果我能够使用php id能够创建一个数组并逐个询问每个结果并得出结果006,007和009

SELECT count(Rating) 
FROM Ratings 
WHERE Rating < 0 and AccountId = 001
1

SELECT count(Rating) 
FROM Ratings 
WHERE Rating < 0 and AccountId = 002
2

SELECT count(Rating) 
FROM Ratings 
WHERE Rating < 0 and AccountId = 006
0

SELECT count(Rating) 
FROM Ratings 
WHERE Rating < 0 and AccountId = 008
1

但是我在这个特定的服务器上没有这种能力,所以我需要能够一次性使用SQL Server(我只是开始学习)...有关我如何管理的任何想法它?

2 个答案:

答案 0 :(得分:0)

SELECT r.AccountId, count(Rating)
FROM Ratings r
JOIN Accounts a
    ON (a.AccountId = r.AccountId)
WHERE a.Flag = 1 AND r.Rating < 0
GROUP BY r.AccountId

答案 1 :(得分:0)

所以我觉得这很有效:

SELECT  A.accountid
FROM    accounts A
        LEFT JOIN ( SELECT  accountID ,
                            MAX(rating) AS rating
                    FROM    ratings
                    GROUP BY accountID
                  ) M ON A.accountID = M.accountID
WHERE   A.flag = 1
AND (M.rating IS NULL OR M.rating < 0)

返回006,007,009

返回006和007,因为在评级表中根本没有评级,它们被标记为活动帐户。 009也被返回,因为在评级表中收到的最高评级小于0,因此该帐户收到的评分均不为正。