【问题标题】:postgresql: join syntax error when joining 2 select statementspostgresql:加入 2 个选择语句时出现连接语法错误
【发布时间】:2023-03-09 21:37:01
【问题描述】:

我正在从临床试验.gov 查询 aact 数据库。数据库模型就在这里:https://aact.ctti-clinicaltrials.org/schema。我有两个可供选择的模式(ctgov、proj_cdek_standard_orgs)。我正在尝试加入两个选择语句。 编辑:我现在尝试为我的子查询设置别名,但这仍然没有任何作用。我收到以下错误:

(SELECT ctgov.sponsors.name, ctgov.sponsors.nct_id, ctgov.sponsors.id, ctgov.studies.phase
FROM ctgov.sponsors, ctgov.studies
WHERE ctgov.sponsors.nct_id=ctgov.studies.nct_id) A

FULL [OUTER] JOIN


(SELECT proj_cdek_standard_orgs.cdek_synonyms.id, proj_cdek_standard_orgs.cdek_synonyms.name
FROM proj_cdek_standard_orgs.cdek_synonyms) B

ON

A.name = B.name;

我可以自己完美地执行两个选择语句,但我尝试查询并收到此错误:

ERROR: syntax error at or near "t1" LINE 7: ) t1

我做错了什么以及如何使用联接而不出现语法错误?

【问题讨论】:

  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你的期望和原因。
  • use text, not images/links, for text--including tables & ERDs。转述或引用其他文本。只提供您需要的东西并将其与您的问题联系起来。仅将图像用于无法表达为文本或增强文本的内容。 PS Re“我如何在不出现语法错误的情况下使用连接”不要要求我们(重新)编写另一个 SQL 演示文稿,请证明您为什么认为这将根据一些权威的演示文稿起作用,以便我们可以解决您的误解/误读。每个帖子提出 1 个(特定研究且不重复的)问题。

标签: sql postgresql join syntax


【解决方案1】:

请使用以下查询,

SELECT ctgov.sponsors.name, ctgov.sponsors.nct_id, ctgov.sponsors.id, 
    ctgov.studies.phase, proj_cdek_standard_orgs.cdek_synonyms.id, 
    proj_cdek_standard_orgs.cdek_synonyms.name
FROM ctgov.sponsors, ctgov.studies, proj_cdek_standard_orgs.cdek_synonyms
WHERE ctgov.sponsors.nct_id=ctgov.studies.nct_id
and proj_cdek_standard_orgs.cdek_synonyms.name = ctgov.sponsors.name;

但正确的方法是使用传统的连接,

SELECT ctgov.sponsors.name, ctgov.sponsors.nct_id, ctgov.sponsors.id, 
    ctgov.studies.phase, proj_cdek_standard_orgs.cdek_synonyms.id, 
    proj_cdek_standard_orgs.cdek_synonyms.name
FROM ctgov.sponsors
INNER JOIN ctgov.studies
ON (ctgov.sponsors.nct_id=ctgov.studies.nct_id)
INNER  JOIN proj_cdek_standard_orgs.cdek_synonyms
ON (proj_cdek_standard_orgs.cdek_synonyms.name = ctgov.sponsors.name);

您可以根据需要将其更改为 LEFT 或 FULL OUTER JOIN。

【讨论】:

    【解决方案2】:

    您必须为子查询提供别名。此外,您不应像在第一个子查询中使用的那样使用隐式连接,始终尝试使用显式连接。

    SELECT 
        *
    FROM
    (
      SELECT 
        ctgov.sponsors.name, ctgov.sponsors.nct_id, ctgov.sponsors.id, ctgov.studies.phase
      FROM ctgov.sponsors
      JOIN ctgov.studies
      ON ctgov.sponsors.nct_id=ctgov.studies.nct_id
    ) t1
    
    FULL JOIN
    
    
    (
      SELECT 
        proj_cdek_standard_orgs.cdek_synonyms.id, proj_cdek_standard_orgs.cdek_synonyms.name
      FROM proj_cdek_standard_orgs.cdek_synonyms
    ) t2
    
    ON
    
    t1.name = t2.name;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多