Sql 在UNION ALL视图创建中使用联接

Sql 在UNION ALL视图创建中使用联接,sql,ruby-on-rails,postgresql,Sql,Ruby On Rails,Postgresql,我正在创建一个视图,将两个表合并为一些相似的字段和一些不同的字段。这95%有效,但表A中有一个字段与表B中的一个字段匹配,但前提是您将表B中的字段用作联接,以从表C中提取字段。下面代码中唯一不起作用的部分是联接。我可以把这两个字段都放进去,然后按照逻辑从模型中的ehruser\u id中获取provider\u id,但我觉得这在SQL中应该是可行的,我只是还不知道如何让最后一位工作 DROP VIEW IF EXISTS vunifiedschedule CASCADE; CREATE VIE

我正在创建一个视图,将两个表合并为一些相似的字段和一些不同的字段。这95%有效,但表A中有一个字段与表B中的一个字段匹配,但前提是您将表B中的字段用作联接,以从表C中提取字段。下面代码中唯一不起作用的部分是联接。我可以把这两个字段都放进去,然后按照逻辑从模型中的
ehruser\u id
中获取
provider\u id
,但我觉得这在SQL中应该是可行的,我只是还不知道如何让最后一位工作

DROP VIEW IF EXISTS vunifiedschedule CASCADE;
CREATE VIEW vunifiedschedule AS
SELECT
    schedule_block.id as vid,
    schedule_block.reason as vblock_reason,
    NULL as vappointment_reason_id,
    schedule_block.when_ts as vwhen,
    schedule_block.deleted_ts as vdeleted_when,
    schedule_block.placeofservice_id as vlocation_id,
    schedule_block.duration as vduration,
    true as vappointment_book,
    schedule_block.note as vnote
FROM schedule_block
LEFT JOIN ( SELECT id FROM provider) as vprovider_id ON provider.ehruser_id = schedule_block.ehruser_id
UNION ALL
SELECT
    appointment.id AS vid,
    NULL as vblock_reason,
    appointment.appointmentreason_id AS vappointment_reason_id,
    appointment.appt_when AS vwhen,
    appointment.deleted_when AS vdeleted_when,
    appointment.location_id AS vlocation_id,
    appointment.visit_length AS vduration,
    appointment.appointment_book as vappointment_book,
    appointment.note AS vnote,
    appointment.provider_id as vprovider_id
FROM appointment
我得到的错误是
错误:表“provider”的子句条目中缺少

第14行:…从提供程序中选择id)作为提供程序上的vprovider_id。例如:

您从第一个表中选择了9列,从第二个表中选择了10列,使用union时,两个查询中的列数必须相同,并且选择的类型列必须匹配。

您从第一个表中选择了9列,从第二个表中选择了10列,使用union时,两个查询中的列数必须相同,并且所选的类型列必须匹配。

错误非常明显。您没有
提供程序
。我认为你打算:

FROM schedule_block LEFT JOIN
     ( SELECT id FROM provider) vprovider_id
     ON vprovider.ehruser_id = schedule_block.ehruser_id
--------^
但是,子查询是不必要的:

FROM schedule_block LEFT JOIN
     provider
     ON provider.ehruser_id = schedule_block.ehruser_id

错误很明显。您没有
提供程序
。我认为你打算:

FROM schedule_block LEFT JOIN
     ( SELECT id FROM provider) vprovider_id
     ON vprovider.ehruser_id = schedule_block.ehruser_id
--------^
但是,子查询是不必要的:

FROM schedule_block LEFT JOIN
     provider
     ON provider.ehruser_id = schedule_block.ehruser_id
  • 视图的第一个选择stmt有9列,但第二个选择stmt有10列。此视图将显示错误消息“查询块的结果列数不正确
  • 视图的第一个select stmt有9列,但第二个select stmt有10列。此视图将出错,并显示消息“查询块的结果列数不正确”

  • 联接是第10列联接列也必须出现在选择列表中。因为它不是你真正选择的。联接是FROM子句而不是SELECT子句的一部分。联接是第10列。联接列也必须出现在SELECT列表中。因为它不是你真正选择的。JOIN是FROM子句的一部分,而不是SELECT子句。
    JOIN
    是第10列
    JOIN
    是第10列“在
    provider
    表中查找
    ehruser\u id
    列中的值与
    schedule\u块当前行中
    ehruser\u id
    列的值匹配的行。从该行获取id,并将其用作
    vprovider\u id
    ”。我尝试做的纯英语版本是“在
    provider
    表中查找该行,
    ehruser\u id
    列中的值与
    schedule\u块
    表当前行中的
    ehruser\u id
    列的值匹配。从该行获取id,并将其用作
    vprovider\u id
    “@mrben522。您甚至没有在选择中从
    vprovider
    中进行选择。如果你是,你只会选择你想要的专栏。我真的不明白你的评论到底是什么意思。您只获得在外部
    选择中引用的列。此解决方案是正确的,我缺少连接的另一半(将列添加到选择中)@mrben522。您甚至没有在选择中从
    vprovider
    中进行选择。如果你是,你只会选择你想要的专栏。我真的不明白你的评论到底是什么意思。您只获得在外部
    选择中引用的列。此解决方案是正确的,我缺少连接的另一半(将列添加到选择中)