2015-04-23 92 views
0

我對編碼比較新,所以請耐心等待。聯合查詢合併3個表結果

我想結合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的第一個日期撤回患者'accesstype'日期。

我不知道這是否甚至讓你感覺到,但希望有人可以幫助..你們都通常很漂亮!

提前致謝!

Mikey

+0

道歉的格式!我的第一篇文章! –

回答

1

所有查詢都需要在SELECT語句中具有相同數量的列。它看起來像你第一次查詢具有最大數量的列,所以你需要「填充」另一列具有相同數量的列。您可以使用NULL as col創建具有全部空值的列。

0

要回答這個問題(我認爲)您要求...對於UNIONUNION ALL設置操作,您是正確的:返回的列的數量和列的數據類型必須匹配。

但是可以在SELECT列表中返回一個字面值作爲表達式。例如,如果您不想返回HPACCE列的值,則可以用文字或NULL替換它。 (如果列是字符數據類型(我們不能從問題中提供的信息代替HPACCE AS ta告訴),您可以使用(例如)文字空字符串'' 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的那一行)。其他數據庫將在這條語句中引發一個異常/錯誤,沿着「在SELECT列表中不聚集的行」通過」。但是這是允許的(沒有錯誤或警告)由MySQL特定的GROUP BY行爲擴展。(我們可以讓MySQL像其他數據庫一樣運行並拋出一個錯誤,我們爲sql_mode指定一個包含ONLY_FULL_GROUP_BY(?)的值。)

外部查詢的謂詞不會被推入內聯視圖bla 。對於每個fk_oid,視圖bla將實現,並且這可能是大集合上的性能問題。

此外,限定所有列引用將使該語句更易於閱讀。而且,當將名爲(例如)tadte1的列添加到person表中時,這也將隔離該語句在未來拋出「不明確的列」錯誤。

+0

謝謝!這做了我所需要的。仍然在日期問題上工作,雖然 –

+0

道歉..就像我說的,新的這一點。但是,請介紹一下如何在最低限度的時間內獲得ta? 基本上,病人可能有多個ta的值,但我只想看看他們在最低dte時的價值。 –