SQL试图在子查询中使用联接表中的列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL试图在子查询中使用联接表中的列相关的知识,希望对你有一定的参考价值。

这是我目前拥有的内容,它返回3列Patient_id,group_concat_1和group_concat_2:

SELECT patient_id,
(SELECT GROUP_CONCAT(column1) FROM 
table1 where patient_id = patient.id
) group_concat_1,
(SELECT GROUP_CONCAT(column1) FROM 
table2 where patient_id = patient.id
) group_concat_2
FROM patient

但是,我需要返回一个组合了group_concat_1和group_concat_2的列,所以我尝试了此操作:

SELECT patient_id,
SELECT CONCAT(group_concat_1, group_concat_2) FROM (
    (SELECT GROUP_CONCAT(column1) FROM 
    table1 where patient_id = patient.id
    ) group_concat_1,
    (SELECT GROUP_CONCAT(column1) FROM 
    table2 where patient_id = patient.id
    ) group_concat_2 
)
FROM patient

但是他显然不起作用,因为现在无法在内部子查询中找到Patient.id。有什么建议吗?谢谢!

答案
您可以直接连接两列:

SELECT p.patient_id, CONCAT( (SELECT GROUP_CONCAT(column1) FROM table1 where patient_id = p.patient.id), (SELECT GROUP_CONCAT(column1) FROM table2 where patient_id = p.patient.id) ) FROM patient p

另一答案
我很确定您为此目的想要concat_ws()

SELECT patient_id, CONCAT_WS(',' (SELECT GROUP_CONCAT(t1.column1) FROM table1 t1 where t1.patient_id = p.id ), (SELECT GROUP_CONCAT(t2.column1) FROM table2 t2 where t2.patient_id = p.id ) ) as combined FROM patient p;

有两个原因:

    您可以区分table1中的最后一个元素和`table2中的第一个元素。
  1. 如果其中一个表没有匹配值,则返回另一个表的结果。
  • 还请注意,我添加了表别名和限定的列名。当处理具有多个表引用的查询时,这非常重要-它有助于防止某些很难调试的错误。

    我还要补充一点,您的原始查询将在大多数数据库中运行。 mysql和Oracle碰巧是两个不理解嵌套相关子句的。

  • 以上是关于SQL试图在子查询中使用联接表中的列的主要内容,如果未能解决你的问题,请参考以下文章

    如何在子查询中使用外部查询中的列从另一个表中获取结果?

    使用内部联接更新多个表中的列

    SQL Server - 在子查询中使用主查询中的列

    SQL语句优化

    带有内部联接的 SQL 更新查询语法

    如何使用 Amazon Redshift 中的临时表列更新现有表中的列?