没有问题的子查询

时间:2017-09-06 21:42:50

标签: sql sql-server

此处的数据是图表和apptdate(图表是患者编号)。 我想知道哪些患者没有药物。自20170301以来

SELECT chart
FROM [Dentrix].[dbo].[DDB_APPT_BASE] 
WHERE apptdate not in (
    SELECT *
    FROM [Dentrix].[dbo].[DDB_APPT_BASE] 
    WHERE APPTDATE > '20170301'
)

但此查询被拒绝

  

Msg 116,Level 16,State 1,Line 4   当未使用EXISTS引入子查询时,只能在选择列表中指定一个表达式。

5 个答案:

答案 0 :(得分:2)

如果chart是"患者",那么您可以使用聚合:

SELECT chart
FROM [Dentrix].[dbo].[DDB_APPT_BASE] 
GROUP BY chart
HAVING MAX(apptdate) < '20170301';

如果您愿意,可以使用NOT EXISTS(或NOT IN,尽管我强烈建议NOT EXISTS)使用相关子查询来执行此操作:

SELECT DISTINCT dab.chart
FROM [Dentrix].[dbo].[DDB_APPT_BASE] dab
WHERE NOT EXISTS (SELECT 1
                  FROM [Dentrix].[dbo].[DDB_APPT_BASE]  dab2
                  WHERE dab2.chart = dab.chart AND dab2.APPTDATE > '20170301'
                 );

但我认为第一种方法更容易。

答案 1 :(得分:2)

使用'NOT IN'运算符,子查询中只能返回1个字段。

SELECT chart
FROM [Dentrix].[dbo].[DDB_APPT_BASE] 
WHERE apptdate not in (
    SELECT apptdate
    FROM [Dentrix].[dbo].[DDB_APPT_BASE] 
    WHERE APPTDATE > '20170301'
)

但是,你为什么不这样做:

SELECT chart
FROM [Dentrix].[dbo].[DDB_APPT_BASE] 
WHERE APPTDATE <= '20170301'

答案 2 :(得分:1)

我认为你正在寻找这个:

SELECT chart
FROM [Dentrix].[dbo].[DDB_APPT_BASE] 
WHERE APPTDATE <=  '20170301'

答案 3 :(得分:0)

使用它:

SELECT chart
FROM [Dentrix].[dbo].[DDB_APPT_BASE] where APPTDATE not in  
(SELECT app.APPTDATE FROM [Dentrix].[dbo].[DDB_APPT_BASE] as app
WHERE app.APPTDATE > '20170301')

为什么你不能使用它:

SELECT chart
FROM [Dentrix].[dbo].[DDB_APPT_BASE] as app 
WHERE app.APPTDATE <= '20170301'

答案 4 :(得分:0)

这个嵌套查询:

std::cout << i;

SELECT * FROM [Dentrix].[dbo].[DDB_APPT_BASE] WHERE APPTDATE > '20170301' 作为*列表,其中可能包含许多项目。错误消息是:

  

只能在选择列表中指定一个表达式

因此,选择一个特定的列...具体来说,您需要SELECT

APPTDATE

此外,您可以在逻辑上将该查询简化为以下内容:

SELECT chart
FROM [Dentrix].[dbo].[DDB_APPT_BASE] 
WHERE apptdate not in (
    SELECT APPTDATE
    FROM [Dentrix].[dbo].[DDB_APPT_BASE] 
    WHERE APPTDATE > '20170301'
)