#sql #oracle
#sql #Oracle
Вопрос:
Я хочу проверить, есть ли в таблице A какая-либо запись, тогда в таблице B присутствует ТОЛЬКО значение столбца check table A. Если в TableA нет данных, тогда просто получите данные из TableB.
Я хочу иметь предложение Exists для запроса TableB select тогда и только тогда, когда в таблице есть данные, иначе это будет просто запрос select для TableB
Внутреннее соединение не будет работать, поскольку существует вероятность того, что в TableA не будет никаких данных, даже левого соединения.
Как мне сделать это в одном запросе?
что-то вроде этого :
select Id from TableB where
if( select count(*) from TableA ) > 0 then Id in (select col from TableA)
Комментарии:
1. что? Я не могу понять. оно слишком расплывчатое.
2. Что вы хотите сделать, если таблица A не пуста?
3. поправьте меня, если я неправильно понимаю, вы хотите проверить таблицу A на наличие записи, если да, то вы отобразите записи, имеющие отношение в таблице A и таблице B? а если записей нет? что произойдет? оно просто отобразит все записи таблицы B или ничего не отобразит? потому что, если вы просто хотите найти, есть ли в таблице A запись, связанная с таблицей B, просто используйте Join, и она получит записи для вас..
4. @wrecklez: Ваше понимание верно. проверьте таблицу A, есть ли запись, если да, вы отобразите записи, имеющие отношение в таблице A и таблице B. Если записей нет, то будут просто отображены все записи таблицы B.
5. @user1049021 можете ли вы посмотреть, поможет ли вам мой обновленный ответ?
Ответ №1:
select b.* from tableB b, tableA A
Where b.id = a.id
для этого достаточно простого соединения.
Используется другой способ EXISTS
. И поместите в него свои условия.
select * from tableB b
Where exists
(Select 'x' from tableA a
Where a.id=b.id)
Редактировать:
надеюсь, вам это нужно.
/* first part returns result only when tableA has data */
select b.* from tableB b, tableA A
Where b.id = a.id
Union
/* Now we explicitly check for presence of data in tableA,only
If not we query tableB */
Select * from tableB
Where not exists (select 'x' from tableA)
таким образом, только одна часть запроса вернет результат, являющийся тем же самым результирующим набором, UNION
операция set, которая могла бы выполнить это.
Если вам вообще нужны результаты на основе условий, PL / SQL может быть отличным выбором!
VARIABLE MYCUR REFCURSOR;
/* defines a ref cursor in SQL*Plus */
DECLARE
V_CHECK NUMBER;
BEGIN
SELECT COUNT(*) INTO V_CHECK
FROM TABLEA;
IF(v_CHECK > 0) THEN
OPEN :MYCUR FOR
select b.* from tableB b, tableA A
Where b.id = a.id;
ELSIF
OPEN :MYCUR FOR
select * from tableB;
END IF;
END;
/
/* prints the cursor result in SQL*Plus*/
print :MYCUR
Ответ №2:
select b.id
from table_a a
, table_b b
where a.col = b.id
and a.col_val = 'XXX';
Ответ №3:
я думаю, это может вам помочь, но я знаю, что это не лучший ответ, в моем собственном понимании вы хотите всегда отображать свои записи Table B
и проверять TableA
, есть ли у записи их связи, но я думаю, что не нужно учитывать, есть ли у вас запись в Table A
или нет, если вы используете LEFT JOIN и ставите какое-либо условие для фильтрации вот мой пример…
в этом запросе будут отображены все данные из TableB
, независимо от того, имеют ли они отношение в TableA
или нет, если имеют TableA
и TableB
имеют отношение, это вернет значение, основанное на отношении, но если запись в TableB
не имеет отношения в TableA
, она вернет null
значение, в этом случае вы можете использовать WHERE
для фильтрации того, что вы хотите
SELECT * FROM TableB B
LEFT JOIN Table A ON A.id = B.id
если вы просто хотите отобразить все записи TableB
со связью в TableA
, добавьте это
WHERE NVL(A.id,0) > 0