Sql自联接哪里不存在?

时间:2015-04-20 07:59:14

标签: sql tsql join

我的表格如下:

name    | language | text  
-----------------------------
greet   | 1        | hello
greet   | 2        | bonjour
blue    | 1        | blue
blue    | 2        | bleu 
red     | 1        | red
green   | 1        | green
yellow  | 1        | yellow

我需要检索仅存在于语言编号1的所有记录,因此在上面的示例中,我应该只有一个包含红色,绿色和黄色的列表。我不太了解sql连接,所以不确定最好的方法是什么?任何帮助将不胜感激

4 个答案:

答案 0 :(得分:5)

使用NOT EXISTS

SELECT t.*
FROM dbo.TableName t
WHERE t.language = 1
AND NOT EXISTS
(
   SELECT 1 FROM dbo.TableName t2
   WHERE t.name = t2.name
   AND ( t2.language IS NULL OR t2.language <> 1 )
)

DEMO

我已经包含t2.language IS NULL来向您展示如何处理NULL - 值,如果它是非空列,则只需要t2.language <> 1。 这是最可读和最有效的方法,没有NULL值的问题。有others

答案 1 :(得分:1)

使用NOT IN

过滤记录
SELECT *
FROM TABLENAME
WHERE LANGUAGE = 1
AND  NAME NOT IN
(
   SELECT NAME FROM TABLENAME 
   WHERE   LANGUAGE <> 1
)

答案 2 :(得分:1)

使用jion

SELECT t1.*
  FROM      TableName t1 
  left join TableName t2 
    on t2.name = t1.name 
   and t1.language =  1
   and t2.language <> 1
 where t2.name is null 

答案 3 :(得分:-1)

您只需使用JOIN关键字即可WHERE

SELECT * FROM translationTable WHERE language = 1