2015-06-17 7 views
-4

У меня есть таблица в оракулу с колоннами, как ID и J_CodeSQL запросов для одной и той же таблицы

ID    J_Code 
--------------------------------------------- 
1234   C1234 
1234   FGH89 
1234   BNMG9 
1234   AIOBN 

7890   CVBN0 
7890   FGHJK 
7896   LKJHIN 

Мне нужно написать SQL запрос, который будет возвращать мне посчитать, где J_code начинается с C, но не с А для данный идентификатор. Во время выполнения мы будем передавать идентификатор. Поэтому, когда ID = 1234, счетчик должен быть 0, так как у нас есть «AIOBN». Но когда я прохожу 7890, счет должен быть 1. Возможно ли это с помощью вложенного запроса или самостоятельного присоединения?

+0

Где SQL Query вы по крайней мере попытался самостоятельно? –

+0

'Так что, когда ID = 1234, счет должен быть 0, так как у нас есть« AIOBN ».« Привет, здесь счет должен быть 1 NOT 0, так как на 1-м месте есть C1234 –

+0

Вы должны выбрать MySQL или Oracle, а не и то и другое. – potashin

ответ

1

Используйте следующее:

SELECT count(*) FROM your_table WHERE J_Code NOT LIKE 'a%' AND ID = your_id 
+0

Да, я сделал это ... Но теперь я также хочу проверить, что не должно быть записи для J_Code типа «A%» – user1608869

+0

, где J_code начинается с C, но не с A для данного идентификатора. это условие ваш запрос также возвращает результат 1234 1. –

+0

@MukeshKalgude, пожалуйста, прочитайте вопрос Снова! И еще раз прочитайте ответ и проанализируйте его, как это правильно. –

-1

попробовать этот запрос

select Count(id) 
from table1 
where j_code like 'c%' 
and id not in(select id from table1 where j_code like 'a%') 
and id=1234 
+0

Нет необходимости в 2-м условии 'not like 'a%'', поскольку он уже проверяет только j_code, начиная с буквы 'c' –

+0

Внимательно прочитайте условие –

+0

Если оно начинается с C, то оно никогда не начнется с A. Это все еще не работает Это имеет смысл. – Patrick

0

К сожалению, не знаю, о синтаксисе оракула, согласно SQL Server, запрос может быть: -

Select t.id 
     ,Sum(Case When t.j_code like 'c%' Then 1 Else 0 End) As cCount 
From table As t 
Group By t.id 
Having Sum(Case When t.j_code like 'a%' Then 1 Else 0 End) = 0 
     And Sum(Case When t.j_code like 'c%' Then 1 Else 0 End) > 0 
0

Возникает вопрос:

  • для любых данных Группа строк для «заданного идентификатора», например. 7890:
  • 1) Там должны быть строка, которая имеет J_CODE начиная с «C»
  • 2) Там не должно быть другой ряд, который имеет J_CODE начиная с «A»

Это указывает на то, что ВСЕ строки, принадлежащие группе например 1234.

В тестовых данных, поставляемых:

  • Группа 1234 имеет 1 строку, начинающуюся с «C», а также отдельной строке, которая начинается с «A».
  • Группа 7890 имеет 1 строку, начинающуюся с 'C', и не имеет строку, которая начинается с 'A'.

Обязательно:

  • Group 1234 быть 'недействительным', поскольку он содержит строку 'A'.
  • Группа 7890 является «действительной», поскольку она НЕ ДЕЛАЕТ содержит строку «А».

Существует SQLFiddle

Я решил использовать «коррелировать» суб запрос для проверки существования записи «A».

Я использую «mysql», но это стандартный SQL, поэтому он должен работать в любом месте.

Код:

/* http://sqlfiddle.com/#!9/8ff9bb/1 */ 

SET @whichId = 7890; 

SELECT COUNT(*) 
FROM Q3089887 `JCode_C` 
WHERE 
     `JCode_C`.`ID` = @whichId 
AND `JCode_C`.`J_Code` LIKE 'C%' 
AND NOT EXISTS (SELECT 1 
       FROM Q3089887 `JCode_A` 
       WHERE `JCode_A`.`ID` = `JCode_C`.`ID` 
     AND `JCode_A`.`J_Code` LIKE 'A%' 
     ) 
Смежные вопросы