联合查询以组合3个表

时间:2015-04-23 14:17:58

标签: mysql union

我对编码比较陌生,所以请耐心等待。

我正在尝试合并来自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)

我对联合的理解是列必须是相同的数据类型,但我有两个问题。第一个是accesstypehpacce组合到预期的同一列,但我不想实际看到hpacce数据(不知道这是否可能)。 其次,查询的想法是拉回患者的访问类型'日期为hpdate的第一天。

我不知道这对你们是否有所帮助,但希望有人可以帮助......所有人通常都很漂亮!

提前致谢!

Mikey

2 个答案:

答案 0 :(得分:1)

所有查询都需要在SELECT语句中具有相同数量的列。看起来您的第一个查询具有最大列数,因此您需要" pad"另一个具有相同数量的列。您可以使用NULL as col创建包含所有空值的列。

答案 1 :(得分:0)

要回答这个问题(我认为),您要求...对于UNIONUNION 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 操作将会折叠行;但是来自dte1ta的值来自 行的不确定行。 (即不能保证这些值来自具有dte的最小"值的行。)其他数据库将使用此语句引发异常/错误,与& #34; SELECT列表中的非聚合不在GROUP BY"中。但这是允许(没有错误或警告)由GROUP BY行为的MySQL特定扩展。 (我们可以让MySQL像其他数据库一样运行并抛出一个错误,我们为包含ONLY_FULL_GROUP_BY(?)的sql_mode指定一个值。)

外部查询的谓词不会被推入内联视图bla。视图bla将针对每个fk_oid实现,这可能是大型集上的性能问题。

此外,限定所有列引用将使语句更易于阅读。而且,这也将使该声明不会被抛出一个不明确的专栏"将名为(例如)tadte1的列添加到person表时,将来会出现错误。