上市非记录

Cel*_*l-o 3 sql-server

我有两张桌子。

第一张表:

叫基姆利克

  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)

And*_*ton 5

一些方法:

不在

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快。

编辑:添加变量以在结果集中进行比较和显示

  • +1 FYI NOT EXISTS 是最安全的,因为 NULL 和 NOT IN。并且更快,因为它是半连接而不是与过滤器连接。见 http://dba.stackexchange.com/questions/4009/the-use-of-not-logic-in-relation-to-indexes/4010#4010 (2认同)

gbn*_*gbn 5

第 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)

您必须将日期过滤器添加为常量。
当您检查“无行”时,当然没有可以从中提取数据的行。