此处的数据是图表和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引入子查询时,只能在选择列表中指定一个表达式。
答案 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'
)