需要形成sql查询

需要形成sql查询,sql,sql-server,Sql,Sql Server,我正在准备一个我被卡住的问题 考虑下表: 表1 id key col1 -- --- ----- 1 1 abc 2 2 d 3 3 s 4 4 xyz 表2 id col1 foreignkey -- ---- ---------- 1 12 1 2 13 1 3 14 1 4 12 2 5 13 2 现在,我需要的是只从table1中选择那些table2中对应的条目没有saycol1值为12的记录。 因此,

我正在准备一个我被卡住的问题

考虑下表:

表1

id key col1
-- --- -----
 1  1   abc
 2  2   d
 3  3   s
 4  4   xyz
表2

id col1 foreignkey
-- ---- ----------
1   12    1
2   13    1
3   14    1
4   12    2
5   13    2
现在,我需要的是只从
table1
中选择那些
table2
中对应的条目没有say
col1
值为
12
的记录。 因此,挑战是在应用了
join
之后,即使它将跳过对应于
col1
等于
12
的值1,它仍然有另外多行,这些行的值是
13
14
,它们也有相同的
外键。现在我想要的是,如果有一行的值为
12
,那么它就不应该从
表1
中选择该id

我怎样才能用它形成一个查询

我需要的输出是,从上面的表结构中,我想从表1中获取那些表2中的col1值没有值14的记录。
因此,我的查询应该只返回表1中的第2行,而不是第1行。

这是
不存在的典型情况:

SELECT id, [key], col1
FROM table1 t1
WHERE NOT EXISTS (SELECT 1
                  FROM table2 t2
                  WHERE t2.foreignkey = t1.id AND t2.col1 = 14)
SELECT id, [key], col1
FROM table1 t1
WHERE EXISTS (SELECT 1
              FROM table2 t2
              WHERE t2.foreignkey = t1.id) 
      AND
      NOT EXISTS (SELECT 1
                  FROM table2 t3
                  WHERE t3.foreignkey = t1.id AND t3.col1 = 14)
如果
table2
中有一个相关行具有
col1=14
,则上述查询不会从
table1
中选择一行

输出:

id  key col1
-------------
2   2   d
3   3   s
4   4   xyz
id  key col1
-------------
2   2   d
如果要返回除上述条件集之外,在
表2中也有相关记录的记录,则可以使用以下查询:

SELECT t1.id, MAX(t1.[key]) AS [key], MAX(t1.col1) AS col1
FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.foreignkey
GROUP BY t1.id
HAVING COUNT(CASE WHEN t2.col1 = 14 THEN 1 END) = 0
输出:

id  key col1
-------------
2   2   d
3   3   s
4   4   xyz
id  key col1
-------------
2   2   d
您还可以通过组合使用
EXISTS
NOT EXISTS
实现与第二个查询相同的结果:

SELECT id, [key], col1
FROM table1 t1
WHERE NOT EXISTS (SELECT 1
                  FROM table2 t2
                  WHERE t2.foreignkey = t1.id AND t2.col1 = 14)
SELECT id, [key], col1
FROM table1 t1
WHERE EXISTS (SELECT 1
              FROM table2 t2
              WHERE t2.foreignkey = t1.id) 
      AND
      NOT EXISTS (SELECT 1
                  FROM table2 t3
                  WHERE t3.foreignkey = t1.id AND t3.col1 = 14)

另一种方法。前两个查询仅用于生成示例数据

;WITH t1(id ,[key] ,col1) AS
(
 SELECT 1 , 1 ,  'abc' UNION ALL
 SELECT 2 , 2  , 'd' UNION ALL
 SELECT 3 , 3  , 's' UNION ALL
 SELECT 4 , 4  , 'xyz'
 )
 ,t2(id ,col1, foreignkey) AS
(
SELECT 1  , 12   , 1 UNION ALL
SELECT 2  , 13   , 1 UNION ALL
SELECT 3  , 14   , 1 UNION ALL
SELECT 4   ,12   , 2 UNION ALL
SELECT 5   ,13  ,  2
)
SELECT id, [key], col1
FROM t1
WHERE id NOT IN (SELECT t2.Id
                 FROM t2
                 INNER JOIN t1 ON t1.Id = t2.foreignkey
                 WHERE t2.col1 = 14)

请给出期望输出。。