Sql 在UNION ALL视图创建中使用联接
我正在创建一个视图,将两个表合并为一些相似的字段和一些不同的字段。这95%有效,但表A中有一个字段与表B中的一个字段匹配,但前提是您将表B中的字段用作联接,以从表C中提取字段。下面代码中唯一不起作用的部分是联接。我可以把这两个字段都放进去,然后按照逻辑从模型中的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
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
联接是第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
中进行选择。如果你是,你只会选择你想要的专栏。我真的不明白你的评论到底是什么意思。您只获得在外部选择中引用的列。此解决方案是正确的,我缺少连接的另一半(将列添加到选择中)