我正在准备一个我遇到困难的查询。
考虑以下表格:
表1
id col1 foreignkey
-- ---- ----------
1 12 1
2 13 1
3 14 1
4 12 2
5 13 2
table2
table1
现在我需要的是仅选择table2
中col1
中相应条目没有12
值为join
的{{1}}记录。
所以挑战是在应用col1
之后,即使它会跳过对应于12
等于13
的值1,它仍然有另一个多行,其值为14
,{ {1}}他们也有foreignkey
。现在我想要的是,如果只有一行具有值12
,那么它就不应该从table1
中选择该ID。
如何用此形成查询?
我需要的输出是从表结构上面说我想从table1获取那些来自table2的col1值没有值为14的记录。 所以我的查询应该只返回table1中的第2行而不是第1行。
答案 0 :(得分:0)
这是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)
如果table1
中有table2
的{{1}}个相关行,则上述查询不会从col1 = 14
中选择一行。
<强>输出:强>
id key col1
-------------
2 2 d
3 3 s
4 4 xyz
如果您想要返回的记录除了上面设置的标准外,还有table2
中的相关记录,那么您可以使用以下查询:
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
使用EXISTS
和NOT EXISTS
的组合,您也可以使用第二个查询获得相同的结果:
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)
答案 1 :(得分:0)
另一种方法。前两个查询仅用于生成样本数据。
;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)
答案 2 :(得分:-2)
select t1.id,t1.key,
(select ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col1 DESC) AS Row,* into
#Temp from table1)
from table1 t1
inner join table2 t2 on t1.id=t2.foreignkey
where t2.col1=(select col1 from #temp where row>1)