要求形成一个SQL查询

时间:2015-05-08 05:08:49

标签: sql sql-server

我正在准备一个我遇到困难的查询。

考虑以下表格:

表1

id col1 foreignkey
-- ---- ----------
1   12    1
2   13    1
3   14    1
4   12    2
5   13    2

table2

table1

现在我需要的是仅选择table2col1中相应条目没有12值为join的{​​{1}}记录。 所以挑战是在应用col1之后,即使它会跳过对应于12等于13的值1,它仍然有另一个多行,其值为14,{ {1}}他们也有foreignkey。现在我想要的是,如果只有一行具有值12,那么它就不应该从table1中选择该ID。

如何用此形成查询?

我需要的输出是从表结构​​上面说我想从table1获取那些来自table2的col1值没有值为14的记录。 所以我的查询应该只返回table1中的第2行而不是第1行。

3 个答案:

答案 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

使用EXISTSNOT 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)