【问题标题】:Sub query not in issue子查询没有问题
【发布时间】:2017-09-06 21:42:49
【问题描述】:

这里的数据是chart和apptdate(chart是病人编号)。 我想知道哪些患者没有接受过申请。自 20170301

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

但是这个查询被拒绝了

消息 116,级别 16,状态 1,行 4 当子查询不使用 EXISTS 引入时,选择列表中只能指定一个表达式。

【问题讨论】:

  • 我们可以假设图表(也就是患者 ID)在 DDB_APPT_BASE 中可以有多个记录吗?
  • 是的,您可以拥有一个或数百个应用程序

标签: sql sql-server


【解决方案1】:

如果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'
                 );

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

【讨论】:

  • 我想知道哪个会更好。对于第一个查询,我认为数据库需要找到患者的所有记录以获得最大值,但是对于第二个查询,它可以在找到任何匹配记录后立即停止。当然,对于任何 DB 性能问题,答案都是:尝试一下。
  • @aquinas 。 . .值得尝试看看哪个更好。 select distinct 应该和 group by 一样贵。
【解决方案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'

【讨论】:

  • 确实是替代版本!
  • 是NOT in (),所以他应该反转比较:APPTDATE &lt;= '20170301'
  • @JoelCoehoorn 谢谢乔尔,你是对的。已进行更正。
  • 为什么两个查询都错误的答案会被投票?
  • 刚刚问过 OP,但我认为每个“图表”很可能不止一行
【解决方案3】:

我想你正在寻找这个:

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

【讨论】:

  • 是NOT in (),所以他应该反转比较:APPTDATE &lt;= '20170301'
【解决方案4】:

使用这个:

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'

【讨论】:

    【解决方案5】:

    这个嵌套查询:

    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'
    )
    

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

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

    【讨论】:

      猜你喜欢
      • 2021-07-22
      • 2015-06-26
      • 2021-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多