2016-12-20 7 views
1

Как использовать поле, выбранное во внешней части запроса, в качестве параметра для подзапроса? Я думал, что это было более или менее его, но, очевидно, не как есть должна вернуть пару строкиспользуя поле, выбранное во внешней части запроса в качестве параметра для вспомогательного запроса

SELECT f1, f2, f3 
FROM table1 t1 
WHERE status = 1 
AND (
     SELECT ref from table2 where altref = SUBSTR(t1.f2, 1,4) 
    ) != NULL 

UPDATE Спасибо за все ответы до сих пор. Я должен сказать, что, используя EXIST, будет возвращать true все время, так как строка в подзапросе будет существовать, просто необязательно со значением в 'altref', поэтому я внесла поправки в EXISTS, чтобы включить значение null на alt ref ,

ответ

3

Проблема здесь в том, что вы проверяете null с оператором [in] eqaulity. Null не является значением - это его отсутствие - и, таким образом, любое сравнение значений с ним (например, =, !=, > и т. Д.) Вернет «неизвестный» (что неверно, поэтому любая строка, возвращающая его оценку не будет возвращен).

Вместо этого, вы должны использовать IS оператор:

SELECT f1, f2, f3 
FROM table1 t1 
WHERE status = 1 
AND (
     SELECT ref from table2 where altref = SUBSTR(t1.f2, 1,4) 
    ) IS NOT NULL 
-- Here^ 

Стоит отметить, кстати, что оператор exists может быть чуть более элегантно:

SELECT f1, f2, f3 
FROM table1 t1 
WHERE status = 1 AND 
     EXISTS (SELECT * 
       FROM table2 
       WHERE altref = SUBSTR(t1.f2, 1, 4)) 
1

Ваша проблема != NULL. Это всегда приведет к отказу фильтрации в предложении WHERE (результат будет NULL, который никогда не будет истинным).

Я думаю, что вы хотите:

SELECT f1, f2, f3 
FROM table1 t1 
WHERE status = 1 AND 
     EXISTS (SELECT 1 from table2 t2 where t2.altref = SUBSTR(t1.f2, 1, 4)); 

Если t2.ref может быть NULL, то соответствующая версия:

SELECT f1, f2, f3 
FROM table1 t1 
WHERE status = 1 AND 
     EXISTS (SELECT 1 
       FROM table2 t2 
       WHERE t2.altref = SUBSTR(t1.f2, 1, 4) AND t2.ref IS NOT NULL 
      ); 
1

Используйте EXISTS

SELECT f1, f2, f3 
FROM table1 t1 
WHERE status = 1 
AND exists (
      SELECT ref from table2 where altref = SUBSTR(t1.f2, 1,4) 
      ) 
2

Попробуйте это:

SELECT f1, f2, f3 
FROM table1 t1 
INNER JOIN (
     SELECT ref from table2 where altref = SUBSTR(t1.f2, 1,4) 
    ) as table2 on table2.altref = SUBSTR(t1.f2, 1,4) 
WHERE status = 1 

 Смежные вопросы

  • Нет связанных вопросов^_^