Sql 在where子句中使用子查询

Sql 在where子句中使用子查询,sql,sql-server,sql-server-2005,subquery,where,Sql,Sql Server,Sql Server 2005,Subquery,Where,我需要从这些报告中得到的结果只显示状态为I的患者。我真的不知道如何做,因为这些报告的子查询量很大,而且有很多患者是相关的。我不确定我是否可以在where语句中放置一个子查询来覆盖整个内容。提前感谢您的帮助。SQL Server 2005 SELECT patient_id, ( SELECT p.case_status FROM patient p WHERE p.patient_id = btb.patient_id

我需要从这些报告中得到的结果只显示状态为I的患者。我真的不知道如何做,因为这些报告的子查询量很大,而且有很多患者是相关的。我不确定我是否可以在where语句中放置一个子查询来覆盖整个内容。提前感谢您的帮助。SQL Server 2005

SELECT patient_id,
   (
       SELECT p.case_status
       FROM   patient p
       WHERE  p.patient_id = btb.patient_id
              AND p.episode_id = (
                      SELECT MAX(episode_id)
                      FROM   patient p2
                      WHERE  p2.patient_id = p.patient_id
                  )
   )                            AS 'Status',
   (
       SELECT p.lname + ', ' + p.fname
       FROM   patient p
       WHERE  p.patient_id = btb.patient_id
              AND p.episode_id = (
                      SELECT MAX(episode_id)
                      FROM   patient p2
                      WHERE  p2.patient_id = p.patient_id
                  )
   )                            AS 'client',
   Coverage_plan_id,
   (
       SELECT proc_code
       FROM   billing_transaction bt
       WHERE  bt.clinical_transaction_no = btb.clinical_transaction_no
              AND bt.coverage_plan_id = btb.coverage_plan_id
              AND bt.coverage_plan_id = btb.coverage_plan_id
   )                            AS 'Procedure',
   proc_chron,
   (
       SELECT billing_amt
       FROM   billing_transaction bt
       WHERE  bt.clinical_transaction_no = btb.clinical_transaction_no
              AND bt.coverage_plan_id = btb.coverage_plan_id
   )                            AS 'Billing Amount',
   balance_amount,
   (
       SELECT MAX(accounting_date)
       FROM   billing_ledger bl
       WHERE  bl.clinical_transaction_no = btb.clinical_transaction_no
              AND subtype = 'pa'
              AND bl.coverage_plan_id = 'standard'
   )                            AS 'Last Payment on Trans',
   (
       SELECT MAX(instrument_date)
       FROM   payment p
       WHERE  p.patient_id = btb.patient_id
              AND p.coverage_plan_id = 'standard'
   )                            AS 'Last Payment on Acct',
   (
       SELECT SUM(balance_amount)
       FROM   billing_transaction_balance btb2
       WHERE  btb2.patient_id = btb.patient_id
              AND btb2.coverage_plan_id = btb.coverage_plan_id
              AND proc_chron <= CONVERT(
                      CHAR(6),
                      DATEADD(YEAR, -1, DATEDIFF(DAY, 0, GETDATE())),
                      112
                  ) + '01'
              AND btb2.coverage_plan_id   IN ('standard')
   )                            AS 'Balance'
FROM   billing_transaction_balance     btb
WHERE  proc_chron <= CONVERT(
           CHAR(6),
           DATEADD(YEAR, -1, DATEDIFF(DAY, 0, GETDATE())),
           112
       ) + '01'
       AND coverage_plan_id   IN ('standard')
GROUP BY
       patient_id,
       proc_chron,
       coverage_plan_id,
       balance_amount,
       clinical_transaction_no

FROM子句只包含一个表billing\U transaction\U balance,该表由每个子查询引用


如果将该表的结果限制为仅包含Status='I'的结果,则会覆盖整个查询。通过对包含Status列的表的内部联接,可以最有效地实现这一点

添加一个HAVING status='I'Msg 207,Level 16,State 1,Line 19无效列名'status'。您应该使用联接而不是相关子查询。您的许多子查询都反复出现在同一个表中。这可以通过一个select语句来完成。在第一个名为“Status”的子查询中,where子句中需要有一个p.case_Status='I'。另外,看看肖恩也提到了什么。这是由其他人编写的,我只需要一个水晶报告的精确变体,所以如果可能的话,我真的不想更改它。p.case_status='i'在哪行?我有点明白你的意思,但是你能在代码中展示一下吗?只是为了排队?谢谢。O并且该表没有状态字段。它仅在患者表中作为案例\状态。从账单\交易\余额btb内部连接患者p,其中p.patient\ id=btb.patient\ id和p.Incident\ U id=从患者p2中选择最大事件\ id,其中p2.patient\ id=p.patient\ id和p.case_status='I'Msg 156,第15级,状态1,第15行关键字“WHERE”附近的语法不正确。Msg 156,级别15,状态1,第16行关键字“AND”附近的语法不正确。哦,对不起,我本想将第一个位置改为ON,但忘记了。尝试以下操作:从账单\事务\余额btb内部连接p上的患者p。患者\ id=btb。患者\ id和p.Incide\ id=从患者p2选择MaxIncide\ id,其中p2.patient\ id=p.patient\ id和p.case\ U status='I'