sql 1行拆分成兩行 SQL筆記

2021-10-17 23:58:33 字數 2093 閱讀 2360

select * from 表a where id in (select id from 表b)

上面sql語句相當於

select * from 表a where exists(select 1 from 表b where 表 b.id = 表a.id)

區分in和exists主要是造成了驅動順序的改變(這是效能變化的關鍵),如果是exists,那麼以外層表為驅動表,先被訪問,如果是in,那麼先執行子查詢。所以in適合於外表大而內錶小的情況;exists適合於外表小而內錶大的情況。

一種通俗的可以理解為:將外查詢表的每一行,代入內查詢作為檢驗,如果內查詢返回的結果取非空值,則exists子句返回true,這一行行可作為外查詢的結果行,否則不能作為結果。

比如前端是部門核取方塊,資料傳遞到後端是逗號拼接的部門ids,

一種方法是通過split進行逗號拆分成子查詢:

select items department from dbo.splitl(:departments,',')

第二種是通過charindex函式:

charindex(','+cast(u.department as varchar)+',' , ','+:departments+',')>0

將資料庫中的department左右兩邊填充逗號,再與前端返回的departments比較,看是否存在這個索引

有 a left join b on .. where .. and 這條sql:

1、on and 不會過濾結果記錄條數,只會根據and後的條件是否顯示 b表的記錄,a表的記錄一定會顯示。

2、不管on and 是a.id=1還是b.id=1,都顯示出a表中所有的記錄,並關聯顯示b中對應a表中id為1的記錄或者b表中id為1的記錄。

資料庫在通過連線兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給使用者。

在使用left jion時,on和where條件的區別如下:

1、on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。

2、where條件是在臨時表生成好後,再對臨時表進行過濾的條件。這時已經沒有left join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉。

有兩條sql如下:

select s_id from score group by s_id;

select c_id from score group by s_id;

第二條就會報錯,

原因:這個是按照s_id分組的,

分組是什麼意思,把資料按照某種特徵進行劃分,相同組的特徵相同,不同組的特徵不同,那麼分完組後,我同組內的資料的s_id是不是都相同?

說通俗點:group by s_id意思是將所有具有相同s_id字段值的記錄放到乙個分組裡。那麼group by s_id, c_id 呢?group by s_id, c_id 意思是將所有具有相同s_id字段值和c_id 字段值的記錄放到乙個分組裡。
我們去在select s_id,資料庫會選擇按照s_id分組後的一條記錄顯示,因為我們就是按照sid分組的,相同的組中s_id相同,但是為啥不出現在group by子句中的字段不能選擇呢,比如cid欄位,因為同一組中c_id可能不相同,但是顯示的時候只能取一條,所以取到的值可能正確也可能不正確,

同時也必須結合組合函式,不然分組沒意義

update pt set pt.order_no = (case when id = 1896 then (select order_no from pm_task where id = 1895) when id = 1895 then (select order_no from pm_task where id = 1896) end) from pm_task pt where pt.id in (1895,1896)

select pt.id,pt.name,(select count(1) from pm_task where parent_task_id = pt.id) son_task_num from pm_task pt

。。。。。未完待續

再談 Sql 兩行變一行 例項

要求 按 lct1,lct2 排序後的前兩條紀錄,顯示為下列結果 item cd1 item cd2 lct 01 a a01 3 b01 1 建表準備 if exists select table name from information schema.tables where table na...

oracle 取指定兩行記錄差值sql

在獲取指定兩行的差值,我以前都是兩個表進行join,再相減,偶爾獲得下面的sql,感覺很不錯.例如下面的sql,這裡使用了sum,其中case那裡如果是指定是減數則為正數,指定被減數的使用負數,然後再進行sum,那麼就是 負數也就是相減,也就獲取到指定兩行的差值,非常有創意 select stat ...

用sql實現兩行記錄合併為一行記錄

偶然遇到同學問了個sql的問題,閒著沒事搗鼓了一下。他的問題是 如何把下面這樣的資料,每兩行資料按照第乙個字段合併為一行。create table tp user user no varchar2 2char user name varchar2 10 char user no user name ...