从视图中的 SQL 子查询返回值列表

Posted

技术标签:

【中文标题】从视图中的 SQL 子查询返回值列表【英文标题】:Return list of values from SQL Subquery inside a View 【发布时间】:2016-07-29 14:15:07 【问题描述】:

我这里有四个表(Study、Publication、Location、Drugs)和一个由 Drugs 和 Study 之间的多对多关系引起的连接表。

我使用以下脚本创建了一个视图:

SELECT 
        `l`.`country` AS `country`,
        `l`.`latitude` AS `latitude`,
        `l`.`longitude` AS `longitude`,
        `l`.`region` AS `region`,
        `s`.`enrolment` AS `enrolment`,
        `s`.`diagnosis` AS `diagnosis`,
        `s`.`registry_ID` AS `registry_ID`,
        `s`.`status` AS `status`,
        `s`.`site_name` AS `site_name`,
        `s`.`study_no` AS `study_no`,
        `p`.`pub_year` AS `pub_year`,
        `p`.`URL` AS `url`,
        `p`.`authors` AS `authors`,
        `p`.`pubMedId` AS `pubMedId`,
        `p`.`pub_title` AS `pub_title`,
        `d`.`name` AS `name`
    FROM
        (((`VL`.`Location` `l`
        join `VL`.`Study` `s`)
        join `VL`.`Publication` `p`)
        join `VL`.`Drugs` `d`)
    WHERE
        ((`l`.`id` = `s`.`location_id`)
            and (`p`.`study_id` = `s`.`id`)
            and `d`.`id` in ((SELECT 
                `VL`.`Study_Drugs`.`drugses_id`
            FROM
                `VL`.`Study_Drugs`
            WHERE
                (`VL`.`Study_Drugs`.`studiesList_id` = `s`.`id`))))

现在,我需要子查询为我提供可以在每项研究中找到的药物的完整列表,当我单独执行此查询时会发生这种情况:

SELECT d.name
FROM VL.Drugs d
WHERE d.id IN(SELECT drugses_id
            FROM Study_Drugs
            WHERE studiesList_id = 'whatever id')

所以,问题是为什么它只在查询中返回完整列表,而不是在用作视图脚本的一部分的同一查询中?

EDIT 包括样本数据和希望的结果:

学习:

'2', 'Spleen', '70', NULL, 'KALA-AZAR MEDICAL RESEARCH CENTER, RAMBAG ROAD , MUZAFFARPUR,  BIHAR -842001, INDIA ', 'Published', '75', NULL, '68'

出版:

'12', 'http://www.ncbi.nlm.nih.gov/pubmed/10897369', 'Sundar S, Gupta LB, Rastogi V, Agrawal G, Murray HW.', '10897369', 'Short-course, cost-effective drugs with amphotericin B-fat emulsion cures visceral leishmaniasis.', '2000', '2'

地点:

'68', 'India', '26.118589', '85.400719', 'India Subcontinent'

药物(单独执行子查询时):

'Pentavalent Antimonial'
'Miltefosine'

所以,从我的观点来看,我想要的是所有这些信息,除了来自 Study and Publication 的一些不必要的字段。最终值 (Drugs) 由与研究 id 相关的所有药物形成,我现在每行得到的结果如下:

'India', '26.118589', '85.400719', 'India Subcontinent', '70', 'Spleen', NULL, 'Published', 'KALA-AZAR MEDICAL RESEARCH CENTER, RAMBAG ROAD , MUZAFFARPUR,  BIHAR -842001, INDIA ', '75', '2000', 'http://www.ncbi.nlm.nih.gov/pubmed/10897369', 'Sundar S, Gupta LB, Rastogi V, Agrawal G, Murray HW.', '10897369', 'Short-course, cost-effective drugs with amphotericin B-fat emulsion cures visceral leishmaniasis.', 'Pentavalent Antimonial'

如您所见,最后一个值仅由列表中的第一个药物构成

【问题讨论】:

嗯,where 子句中有很多连接和条件。这些往往会过滤掉行。 连接条件是为了避免行的重复,因为我有 Location in Study 和 Study in Publication 的引用。它不应该影响药物清单。 (我认为:0) 请提供样本数据和预期结果样本。 刚刚用示例数据、希望结果和实际结果编辑了原始问题 【参考方案1】:

我想你希望你的视图看起来像这样

create view your_view
as
select s.*, d.* --explicit name that stuff
from        Location l
inner join  Study s on l.id = s.location_id
inner join  Study_Drugs sd on s.id = sd.study_id
inner join  Drugs d on d.id = sd.drugs_id
inner join  Publications p on s.id = p.study_id;


select * from your_view where study_id = 1; -- whatever id

我不确定您想要这些出版物的用途。 请使用带有“内连接”的“new”表示法,而不是您使用的“where”子句。

【讨论】:

LOL 新的?自 1992 年以来?我同意原始语法很糟糕。但人们需要明白这不是一种新语法,它比许多编程人员更古老。 这就是为什么我在“新”周围使用了引号。 您好,谢谢您的回答,刚刚尝试使用您的版本,我得到的结果集与我自己的完全相同。我需要来自 Publications 和 Studies 的所有数据,因为 View 中的 ResultSet 将转到一个 csv 文件,然后将其解析为 JSON,以便数据可以显示在 Web 应用程序上。 我想我不明白你的确切问题。 对于每项研究都可以有一系列已使用的药物,每种药物都可以用于多个研究,因此我们在那里有一个多对多,由联接表处理.我需要的是从我的视图中表示 ResultSet 的行中的药物列表我设法从短查询中做到这一点,但不是从视图中做到这一点,所以问题是,为什么它对我不起作用查看?

以上是关于从视图中的 SQL 子查询返回值列表的主要内容,如果未能解决你的问题,请参考以下文章

sql 问题子查询返回的值不止一个。

SQL查询从某些表中不存在的子选择返回值?

从sql中返回的查询值的子查询?

使用两个可以返回多个值的子查询的 SQL 之间的语句

如何编写从两个搜索值返回匹配项的 sql 查询

SQL问题,子查询返回的值不止一个!