选择子查询后的SQL Server变量

时间:2019-01-21 04:22:37

标签: sql sql-server sql-server-2005

我有一个如下查询。我担心的是,直到我在子查询之后放了一些东西,该查询才起作用。我从没在SQL中遇到过这样的事情。我的负责人要我在最后一个括弧后面加上一个变量,我担心为什么又好奇为什么要有一个变量。我使用的是SQL Server 2005。

SELECT COUNT(*) 
FROM  
    (SELECT ID 
     FROM NAMES N 
     LEFT JOIN PEOPLE P ON N.ID = P.ID 
     WHERE P.NAME = @name
     GROUP BY ID)

下面的这个作品就像一个护身符。我不明白为什么要在括号后面放些东西。

SELECT COUNT(*) 
FROM   
    (SELECT ID 
     FROM NAMES N 
     LEFT JOIN PEOPLE P ON N.ID = P.ID 
     WHERE P.NAME = @name
     GROUP BY ID) Temp

2 个答案:

答案 0 :(得分:0)

为子查询输入别名 似乎不太有用(甚至对我而言),但是SQL标准说应该有一个别名。确实,没有其他原因。

话虽这么说,您要执行以下一项操作吗?

SELECT ID, COUNT(*) 
FROM NAMES N LEFT JOIN PEOPLE P 
                            ON N.ID = P.ID
WHERE P.NAME = @name
GROUP BY ID

SELECT COUNT(*) 
FROM NAMES N LEFT JOIN PEOPLE P 
                            ON N.ID = P.ID
WHERE P.NAME = @name

编辑:看到您的评论并提到@GordonLinoff,您也可以尝试以下查询;没有加入。

SELECT COUNT(*) 
FROM PEOPLE
WHERE NAME = @name

请注意,如果Names.id或People.id唯一,则其结果将相同。如果这两个字段都不是,则计数将不同。

答案 1 :(得分:0)

一种更简单的写法是

SELECT COUNT(DISTINCT P.ID)
FROM PEOPLE P
WHERE P.NAME = @name;

无论如何,LEFT JOIN子句会将您的INNER JOIN变成WHERE(必须匹配)。然后,JOIN是不必要的,因为您要计算用于ID的{​​{1}}。您可以只计算JOIN中的匹配ID。 PEOPLE不能为ID,因为它用于NULL

如果JOINID中是唯一的,则:

PEOPLE