2015-05-08 5 views
1

Я работал над подготовкой запроса, где я застрял.требуется, чтобы сформировать sql-запрос

Рассмотрим таблицы ниже:

table1

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

table2

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

Теперь то, что мне нужно, это выбрать только те записи из table1, для которых соответствующие записи в table2 не имеют col1 Значение как 12. Итак, проблема заключается в том, что после применения join, хотя он будет пропускать значение 1, соответствующее col1, равное 12, он все еще имеет еще несколько строк, значения которых указаны 13, 14, для которых также они имеют одинаковые foreignkey. Теперь я хочу, если есть одна строка со значением 12, тогда он не должен выбирать этот идентификатор вообще с table1.

Как я могу сформировать запрос с этим?

Результат, который мне нужен, говорит из структуры выше таблицы. Я хочу получить эти записи из таблицы1, для которой значение col1 из таблицы2 не имеет значения как 14. , поэтому мой запрос должен вернуть мне только строку 2 из таблицы1, а не строка 1.

+4

пожалуйста дайте желание выход .. – Dhaval

ответ

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, имеющий 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) 
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
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) 
Смежные вопросы