[英]Union query to combine results of 3 tables
我是编码的新手,请耐心等待。
我正在尝试合并3个表中的数据。 我设法找回了一些数据,但这不是我所需要的。 请在下面查看我的示例。
select oid, rrnhs, idnam, idfnam, dte1, ta
as 'access type' from person
left join
(select fk_oid, min(dte), dte1, ta
from
((Select fk_oid,min(accessdate) as dte, accessdate1 as dte1, accesstype as ta
from vascularpdaccess
where isnull(accesstype)=false group by fk_oid)
union
(Select fk_oid, min(hpdate) as dte, hpdate as dte1, HPACCE as ta
from hdtreatment
where isnull(hptype)=false group by fk_oid)) as bla
group by fk_oid) as access
on person.oid=access.fk_oid
where person.rrnhs in (1000010000, 2000020000, 3000030000)
我对联合的理解是,列必须具有相同的数据类型,但是我有两个问题。 第一个是accesstype
和hpacce
合并到同一列中,如预期的那样,但我不想实际看到hpacce
数据(不知道这是否可能)。 其次,查询的想法是在第一次约会给拉了回来一个病人的接入类型“日期hpdate
。
我不知道这是否对你们都有意义,但希望有人能提供帮助。.你们通常都很漂亮!
提前致谢!
米奇
所有查询在SELECT语句中必须具有相同的列数。 看起来您的第一个查询具有最大的列数,因此您将需要“填充”另一个以具有相同的列数。 您可以使用NULL as col
来创建具有所有空值的列。
要回答这个问题(我认为),您是……对于UNION
或UNION ALL
设置操作,您是正确的:列数和返回的列的数据类型必须匹配。
但是可以在SELECT列表中将文字作为表达式返回。 例如,如果您不想返回HPACCE
列的值, HPACCE
可以将其替换为文字或NULL。 (如果该列是字符数据类型(我们不能从问题中提供的信息中看出),则可以使用(例如)文字空字符串'' AS ta
代替HPACCE AS ta
。
SELECT fk_oid
, MIN(HPDATE) AS dte
, hpdate AS dte1
, NULL AS ta
-- -------------------- ^^^^
FROM hdtreatment
其他注意事项:
谓词ISNULL(foo)=FALSE
可以更简单地表示为foo IS NOT NULL
。
UNION
集运算符将删除重复的行。 如果没有必要,可以使用UNION ALL
set运算符。
内联视图bla
上的后续GROUP BY fk_oid
操作将折叠行; 但它是不确定的,从价值哪一行dte1
和ta
将从。 (即,不能保证那些值将来自具有dte
的“最小”值的行。)其他数据库将使用此语句,沿着“ SELECT列表中未聚合,不在GROUP中的非聚合”行抛出异常/错误。通过”。 但这是MySQL特定于GROUP BY行为的扩展所允许的(没有错误或警告)。 (我们可以使MySQL像其他数据库一样工作,并抛出错误,即为sql_mode指定一个包含ONLY_FULL_GROUP_BY(?)的值。
外部查询的谓词不会被下推到内联视图bla
。 对于每个fk_oid
,视图bla
都将fk_oid
,这在大型集合上可能是性能问题。
此外,限定所有列引用的内容将使该语句更易于阅读。 而且,当将名为(例如) ta
或dte1
的列添加到person
表时,这也可以防止语句将来引发“歧义列”错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.