[英]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.