當前位置:首頁 » 編程語言 » sqlleftjoinonin

sqlleftjoinonin

發布時間: 2024-04-15 20:26:50

sql語句兩表聯查

可以用謂詞或聯結實現:

連接實現:

select * from b join a on b.id=a.id where a.b=21

聯結實現的條件是兩表id來自同一值域,表示意義相同.在連接時其實兩可以作成一個表的:

也就是

id,a.b,a.c,b.b.b.c

但由於空值的問題,導致了部分依賴所以才會拆分成兩個表的.

使用謂詞實現:

select * from b where id in (select id from a where a.b=21)

這個可以實現兩表id來自同一值域,但表示意義不同的情況.也就是說兩表中的id有無關性.

相比較而言,連接的方式更快一些,但這種情況是兩表來自同一值域,且意義相同,如果不是這種情況,可能得不到你正確的值的.而使用謂詞不管意義是否相同,都可以得到正確的值.

資料庫必須知道這兩個表是否具有相關性,也就是設計時的意義,否則優化詞句什麼的都沒有辦法去做的!

  • 有幾種方式可以實現你的這個需求.

    1. 使用表 關聯

    SELECT * FROM 表2 JOIN 表1 ON ( 表2.ID = 表1.列1 );

    2. 使用 IN

    SELECT * FROM 表2 WHERE ID IN ( SELECT 列1 FROM 表1);

    3.使用 EXISTS

    SELECT * FROM 表2

    WHERE EXISTS ( SELECT 1 FROM 表1 WHERE 表2.ID = 表1.列1 );

  • select * from t2 left join t1 on t2.ID = t1.列1 where t1需要啥條件 and t2需要啥條件

  • select * from 表2 where 某列 in (select 列1 from 表1) and id=1

② sql查詢,一對多的join用法

select top 5 * from a表
left join b表
on a表.id = b表.aid
where b表.id in (select Max(id) from b表 group by aid)

③ sql復合查詢語句

selectt0.itemcode,t0.quantity--,t1.*,t1.docstatus,t1.canceled,t1.docdate
frompch1t0
leftjoinopcht1ont0.[DocEntry]=t1.[DocEntry]
where
t1.docdate<'2017-12-01'--條件1
andt0.itemcode='GD01002'-----條件2

union----關鍵部分,欄位一樣時,可以通過union鏈接成一個語句,當部分查詢欄位沒有時,可以根據類型補空或者0

select--t0.itemcode,t0.quantity--,t1.*,t1.docstatus,t1.canceled,t1.docdate
sum(t0.quantity)
fromign1t0
leftjoinoignt1ont0.[DocEntry]=t1.[DocEntry]
WHERE
t1.docdate<'2017-12-01'--條件1
andt0.itemcode='GD01002'-----條件2
groupbyt0.itemcode

……--後面繼續就行
--第二種,建臨時表
if(object_id('temp..#a')>0)
droptable#a
createtable#a
(
itemcodevarchar(100),
quantityint,
docstatusint,
canceledint,
docdatedate
)

insertinto#a(quantity,docstatus,docstatus,canceled,docdate)
selectt0.itemcode,t0.quantity--,t1.*,t1.docstatus,t1.canceled,t1.docdate
frompch1t0
leftjoinopcht1ont0.[DocEntry]=t1.[DocEntry]
where
t1.docdate<'2017-12-01'--條件1
andt0.itemcode='GD01002'-----條件2

insertinto#a(quantity,docstatus,docstatus,canceled,docdate)
select--t0.itemcode,t0.quantity--,t1.*,t1.docstatus,t1.canceled,t1.docdate
sum(t0.quantity)
fromign1t0
leftjoinoignt1ont0.[DocEntry]=t1.[DocEntry]
WHERE
t1.docdate<'2017-12-01'--條件1
andt0.itemcode='GD01002'-----條件2
groupbyt0.itemcode

……--繼續插入數據

--最後查詢
select*from#a
--關於存儲過程
Createprocsp_Test
(
@ddate,
@codevarchar(100)
)
as
begin

--這里只放一個語句,用於參數的示例,只需要將上面的語句放到存儲過程中,並將參數替換就可以了
select--t0.itemcode,t0.quantity--,t1.*,t1.docstatus,t1.canceled,t1.docdate
sum(t0.quantity)
fromign1t0
leftjoinoignt1ont0.[DocEntry]=t1.[DocEntry]
WHERE
t1.docdate<@d--條件1
andt0.itemcode=@code-----條件2
groupbyt0.itemcode
end

④ SQL優化 - 避免使用 IN 和 NOT IN

1、效率低

2、容易出現問題,或查詢結果有誤 (不能更嚴重的缺點)

1、用 EXISTS 或 NOT EXISTS 代替

select * from test1
where EXISTS (select * from test2 where id2 = id1 )
select * FROM test1
where NOT EXISTS (select * from test2 where id2 = id1 )

2、用JOIN 代替

select id1 from test1
INNER JOIN test2 ON id2 = id1
select id1 from test1
LEFT JOIN test2 ON id2 = id1
where id2 IS NULL
妥妥的沒有問題了!

PS:那我們死活都不能用 IN 和 NOT IN 了么?並沒有,一位大神曾經說過,如果是確定且有限的集合時,可以使用。如 IN (0,1,2)。

熱點內容
三方網站源碼 發布:2024-11-28 08:30:51 瀏覽:108
windows版ftp軟體免費下載 發布:2024-11-28 08:25:28 瀏覽:856
淘寶帳號怎麼改密碼 發布:2024-11-28 07:46:05 瀏覽:11
監控未配置怎麼辦視頻 發布:2024-11-28 07:44:41 瀏覽:502
android獲取手機的ip 發布:2024-11-28 07:42:13 瀏覽:171
python打開文件窗口 發布:2024-11-28 07:36:13 瀏覽:555
cpu二級緩存的作用 發布:2024-11-28 07:36:12 瀏覽:1001
net資料庫控制項 發布:2024-11-28 07:32:58 瀏覽:99
我的世界國際服創建伺服器pc 發布:2024-11-28 07:20:53 瀏覽:773
編譯原理LR分析法pdf 發布:2024-11-28 07:17:41 瀏覽:264