Sql server 2008 SQL选择不在联接表中的内容

Sql server 2008 SQL选择不在联接表中的内容,sql-server-2008,tsql,join,left-join,outer-join,Sql Server 2008,Tsql,Join,Left Join,Outer Join,嗯。我在一个表中有一些数据,这些数据多次引用另一个表中的一些数据 表1-主客户端表 表2-用户定义字段 假设我有一个查询,其中显示了表1中的客户机id和表2中所有附加/使用的定义字段 SELECT t1.Id, t2.udf FROM Table1 t1 JOIN Table2 t2 ON t1.Id = t2.Index WHERE t1.EndDate IS NULL AND t1.Id = '1234.9876' AND 我会得到以下结果 ID UDF

嗯。我在一个表中有一些数据,这些数据多次引用另一个表中的一些数据

表1-主客户端表 表2-用户定义字段

假设我有一个查询,其中显示了表1中的客户机id和表2中所有附加/使用的定义字段

SELECT t1.Id, t2.udf
FROM Table1 t1
JOIN Table2 t2 ON t1.Id = t2.Index
WHERE t1.EndDate IS NULL AND
      t1.Id = '1234.9876' AND
我会得到以下结果

ID            UDF
1234.9876     100
1234.9876     110
1234.9876     118
1234.9876     124
1234.9876     198
1234.9876     256
现在,假设我想查询同样的东西,只获取客户机的ID,但前提是t2.udf的值等于'194'不存在。所以,我只需要

ID           
1234.9876    

…因此

将联接设为左联接和文件管理器,其中t2.Index为null

SELECT t1.Id
FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.Id = t2.Index
AND t2.UDF = 194   -- has to be before where clause
WHERE t2.Index IS NULL
AND t1.EndDate IS NULL 
AND t1.Id = '1234.9876'  -- not sure if you want this part
另一种使用的方式不存在

SELECT t1.Id
FROM Table1 t1
WHERE NOT EXISTS (SELECT 1 FROM  Table2 t2 WHERE t1.Id = t2.INDEX
                AND t2.UDF = 194)
AND t1.EndDate IS NULL 
AND t1.Id = '1234.9876'  

另请参见将联接设为左联接和文件管理器,其中t2.Index为空

SELECT t1.Id
FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.Id = t2.Index
AND t2.UDF = 194   -- has to be before where clause
WHERE t2.Index IS NULL
AND t1.EndDate IS NULL 
AND t1.Id = '1234.9876'  -- not sure if you want this part
另一种使用的方式不存在

SELECT t1.Id
FROM Table1 t1
WHERE NOT EXISTS (SELECT 1 FROM  Table2 t2 WHERE t1.Id = t2.INDEX
                AND t2.UDF = 194)
AND t1.EndDate IS NULL 
AND t1.Id = '1234.9876'  

另请参见

您可以在udf“194”所在的表2中选择udf中添加和t2.udf not。
但是@sqlmeane解决方案更好

您可以添加和t2.udf,而不是从表2中选择udf,其中udf“194”。 但是@sqlnemage解决方案更好

这应该可以做到

SELECT DISTINCT t1.Id 
FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.Id = t2.Index
WHERE t2.UDF NOT IN (194)
AND t2.Index IS NULL
Select DISTINCT为您提供满足其他条件的唯一条目,以及第一个where子句

  t2.UDF NOT IN (194)
Normall将返回t1的所有行,其中t2.UDF不是194,但它受到Select Distinct的限制,只提供Distinct id,这应该可以做到

SELECT DISTINCT t1.Id 
FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.Id = t2.Index
WHERE t2.UDF NOT IN (194)
AND t2.Index IS NULL
Select DISTINCT为您提供满足其他条件的唯一条目,以及第一个where子句

  t2.UDF NOT IN (194)
Normall将返回t2.UDF不是194的t1的所有行,但它受到Select Distinct的限制,仅为您提供Distinct id,请尝试以下操作:

SELECT t1.Id
FROM Table1 t1
JOIN Table2 t2 ON t1.Id = t2.Index
WHERE t1.EndDate IS NULL AND
      t1.Id = '1234.9876' AND
      t2.udf <> '194'
请尝试以下操作:

SELECT t1.Id
FROM Table1 t1
JOIN Table2 t2 ON t1.Id = t2.Index
WHERE t1.EndDate IS NULL AND
      t1.Id = '1234.9876' AND
      t2.udf <> '194'

+1在几乎所有情况下。@AaronBertrand如果表2在联接列上与表1有FK关系,并且该列是表2上复合PK的一部分,是否有点击左联接?这正是我需要的。我以前用过LEFT JOIN,但从未用过那种方式。你每天都能学到新东西,是吗?多谢各位。你是个救命恩人。@AaronBertrand几乎所有情况下都是+1。@AaronBertrand如果表2在联接列上与表1有FK关系,并且该列是表2上复合PK的一部分,是否有点击左键联接?这正是我需要的。我以前用过LEFT JOIN,但从未用过那种方式。你每天都能学到新东西,是吗?多谢各位。你是个救生员。