我对编码比较陌生,所以请耐心等待。
我正在尝试合并来自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
的第一天。
我不知道这对你们是否有所帮助,但希望有人可以帮助......所有人通常都很漂亮!
提前致谢!
Mikey
答案 0 :(得分:1)
所有查询都需要在SELECT语句中具有相同数量的列。看起来您的第一个查询具有最大列数,因此您需要" pad"另一个具有相同数量的列。您可以使用NULL as col
创建包含所有空值的列。
答案 1 :(得分:0)
要回答这个问题(我认为),您要求...对于UNION
或UNION ALL
设置操作,您是正确的:返回列的列数和数据类型必须匹配
但是可以在SELECT列表中返回一个文字作为表达式。例如,如果您不想返回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
设置运算符。
内联视图GROUP BY fk_oid
上的后续 bla
操作将会折叠行;但是来自dte1
和ta
的值来自 行的不确定行。 (即不能保证这些值来自具有dte
的最小"值的行。)其他数据库将使用此语句引发异常/错误,与& #34; SELECT列表中的非聚合不在GROUP BY"中。但这是允许(没有错误或警告)由GROUP BY行为的MySQL特定扩展。 (我们可以让MySQL像其他数据库一样运行并抛出一个错误,我们为包含ONLY_FULL_GROUP_BY(?)的sql_mode指定一个值。)
外部查询的谓词不会被推入内联视图bla
。视图bla
将针对每个fk_oid
实现,这可能是大型集上的性能问题。
此外,限定所有列引用将使语句更易于阅读。而且,这也将使该声明不会被抛出一个不明确的专栏"将名为(例如)ta
或dte1
的列添加到person
表时,将来会出现错误。