我有两张桌子。
第一张表:
叫基姆利克
id ad
---------------
1 ahmet
2 mehmet
3 ali
Run Code Online (Sandbox Code Playgroud)
第二表:
称为 siparis
id kimlikid tarih miktar
------------------------------------------------------------
1 1 22.09.2011 10
1 2 22.09.2011 100
Run Code Online (Sandbox Code Playgroud)
我想通过 SQL 查询向那些在 2011 年 9 月 22 日没有下订单的人列出。
结果:
ad tarih
--------------------------
ali 22.09.2011
Run Code Online (Sandbox Code Playgroud)
一些方法:
DECLARE @NoDateWanted date = '22.09.2011';
SELECT ad, @NoDateWanted as tarih
FROM
kimlik k
WHERE
k.ID NOT IN (SELECT kimlikid FROM siparis s WHERE s.tarih = @NoDateWanted)
Run Code Online (Sandbox Code Playgroud)
DECLARE @NoDateWanted date = '22.09.2011';
SELECT ad, @NoDateWanted as tarih
FROM
kimlik k
WHERE
NOT EXISTS(SELECT 'kimlik' FROM siparis s
WHERE k.id = s.kimlikid
and s.tarih = @NoDateWanted)
Run Code Online (Sandbox Code Playgroud)
DECLARE @NoDateWanted date = '22.09.2011';
SELECT ad, @NoDateWanted as tarih
FROM
kimlik k
left join siparis s
on s.kimlikid = k.id
and s.tarih = @NoDateWanted
WHERE s.id IS NULL
Run Code Online (Sandbox Code Playgroud)
您选择的方法通常取决于个人喜好和性能(它们可以根据您的数据量生成不同的查询计划),即:如果 siparis 每个 kimlik id 有 1,000 行,则NOT EXISTS通常比LEFT JOIN快。
编辑:添加变量以在结果集中进行比较和显示
第 4 种方法是在 RDBMS 支持的地方使用EXCEPT
(又名MINUS
)。
这应该给出与相同的执行计划NOT EXISTS
DECLARE @NoDateWanted date = '20110922';
SELECT id, @NoDateWanted AS tarih
FROM kimlik
EXCEPT
SELECT id, @NoDateWanted
FROM siparis
WHERE tarih = @NoDateWanted;
Run Code Online (Sandbox Code Playgroud)
您必须将日期过滤器添加为常量。
当您检查“无行”时,当然没有可以从中提取数据的行。
归档时间: |
|
查看次数: |
79 次 |
最近记录: |