【问题标题】:What is the issue in below sql query? [closed]下面的sql查询有什么问题? [关闭]
【发布时间】:2021-02-11 06:01:00
【问题描述】:

我是 sql 的初学者。任何人都请告诉我我的自定义查询的问题。

select * 
from Follow_My_Doct.tbl_hospital_registration h 
INNER JOIN Follow_My_Doct.tbl_subscribed_packages s 
      ON  s.hospitalId = h.id 
      AND s.active = 1 
      AND ( select max(sp.expireDate), sp.hospitalId 
            from Follow_My_Doct.tbl_subscribed_packages sp
            where sp.active = 1 
            group by sp.hospitalId ) 
where h.hospital_active = 1

错误代码:1241。操作数应包含 1 列

订阅表

hospital Id expireDate
145         2021-07-10
146         2021-06-10
147         2021-09-10
146         2021-10-10

【问题讨论】:

  • ON 子句中的子查询必须做什么?它给出了一个 2 列的行集 - 很多行,每列 2 列,而在 ON 中必须使用单个标量值(可能被视为一些布尔值)。
  • 为什么在 ON 子句中需要子查询?
  • @FabioMendesSoares 为该医院选择 max(exp.date)(即存在一对多关系)
  • 然后,我会在新的 INNER JOIN 子句中添加这个子查询,就像刚刚发布的答案一样
  • @FabioMendesSoares 我添加了,但 146 号医院返回 2 次。即,它不占用 max(exp.date)

标签: mysql sql group-by inner-join mysql-workbench


【解决方案1】:

您应该将该子查询与 max 和 group by 放在 INNER JOIN 子句中。

select * 
from Follow_My_Doct.tbl_hospital_registration h 
INNER JOIN ( select max(sp.expireDate) maxexpiredate, sp.hospitalId 
            from Follow_My_Doct.tbl_subscribed_packages sp
            where sp.active = 1 
            group by sp.hospitalId ) as s 
      ON  s.hospitalId = h.id 
where h.hospital_active = 1

由于我没有您的数据表,因此我创建了一个环境来使用表变量来测试该查询。下面的示例适用于 SQL Server,但该查询适用于 MySQL,目前我还没有在我的机器上安装它。

declare @tbl_subscribed_packages TABLE(
  hospitalId int, 
  active bit, 
  expiredate datetime
)

declare @tbl_hospital_registration table(
 id int,
 hospital_active bit)

现在用数据填充表格:

insert @tbl_hospital_registration 
values (145,1),(146,1),(147,1)

insert @tbl_subscribed_packages 
values (145,1,'2021-07-10')
,(146,1,'2021-06-10')
,(147,1,'2021-09-10')
,(146,1,'2021-10-10')

然后,我针对这些数据测试查询

select * 
from @tbl_hospital_registration h 
INNER JOIN ( select max(sp.expireDate) maxexpiredate, sp.hospitalId 
            from @tbl_subscribed_packages sp
            where sp.active = 1 
            group by sp.hospitalId ) as s 
      ON  s.hospitalId = h.id 
where h.hospital_active = 1

请注意,在 INNER JOIN 中使用子查询作为视图,我应该为 max(expireDate) 列添加别名。 结果是:

id hospital_active maxexpiredate hospitalId
145 1 2021-07-10 00:00:00.000 145
146 1 2021-10-10 00:00:00.000 146
147 1 2021-09-10 00:00:00.000 147

这是你想要的吗?

【讨论】:

  • 是的,它工作正常...谢谢你
【解决方案2】:

第 6 行有问题。在 AND 之后你应该有条件,但你有子查询返回两列值

【讨论】:

  • 你能更新那个查询吗?
  • 您没有提及您的要求。请更新您的要求以及您希望如何查看结果(带有输出列)
【解决方案3】:

您可以尝试以下方法 - 使用 row_number()

select * from
(
    select *,row_number() over(partition by s.hospitalId order by expireDate desc ) as rn from 
    Follow_My_Doct.tbl_hospital_registration h INNER JOIN Follow_My_Doct.tbl_subscribed_packages s 
    ON s.hospitalId = h.id 
    where h.hospital_active = 1 and s.active = 1 
)A where rn=1

【讨论】:

  • 此查询多次(2 次)返回同一家医院,我只需要该医院的 max(exp.date)
  • 请在更新问题中查看我的订阅表。执行你的查询它的 146 行来了 2 次​​span>
  • @Bueno,我已经更新了答案 - 你现在可以查看
  • 仍然返回医院 id 146 行 2 次。我只需要返回 max(exp.date).ie,它只会返回一个医院(Id 146)
  • 使用 row_number() 一些 sql 语法错误:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-11
相关资源
最近更新 更多