需要形成sql查询
我正在准备一个我被卡住的问题 考虑下表: 表1需要形成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的记录。 因此,
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
的记录。
因此,挑战是在应用了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)
请给出期望输出。。