2014-07-07 227 views
0

我想檢查表A是否有任何條目THEN ONLY檢查表A列值存在於表B中。如果TableA中沒有數據,則只需從TableB獲取數據。SQL:如果where條款中的條件

我想有存在表B中選擇查詢子句當且僅當存在TablaA數據要不然就只是簡單的選擇查詢表B

內連接不會工作,因爲有可能性,即表A不會有任何數據,甚至沒有加入。

如何在單個查詢中執行此操作?

是這樣的:

select Id from TableB where 
if(select count(*) from TableA) > 0 then Id in (select col from TableA) 
+0

什麼?我不明白。它太模糊了。 – bumbumpaw

+0

如果表A不是空的,你想怎麼做? –

+0

糾正我,如果我的理解錯誤,你想 檢查表A是否有記錄,如果是,你會顯示記錄與表A和表B有關係嗎?如果沒有記錄?會發生什麼?它只會顯示錶B的所有記錄,否則它將不顯示任何內容?因爲如果您只想查找表A中是否存在與表B相關的記錄,只需使用加入即可獲得記錄。 – wrecklez

回答

0
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設置操作,可以使這件事。

如果你想要基於條件的結果,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 
0
select b.id 
from table_a a 
, table_b b 
where a.col = b.id 
and a.col_val = 'XXX'; 
0

我覺得這可能會幫助你,但我知道這是不是最好的答案, 在我自己的理解要始終顯示Table B的記錄,並檢查TableA如果有一個記錄找到自己的關係,但我認爲它並不需要計算,如果你有一個紀錄Table A與否,如果你使用LEFT JOIN,並把一些條件來篩選這裏是我的例子......

此查詢所有的TableB數據將顯示無論是否在TableA或沒有TableATableB有關係,它會回報關係的價值基礎,但如果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