2017-05-07 65 views
2

有沒有什麼辦法在Interbase firebird的一個選擇過程中有兩個不同的where子句?有沒有什麼辦法在Interbase firebird的一個選擇過程中有兩個不同的where子句?

我創建了兩個表來支持這個問題。所需的輸出是,即使表SAMPLE_DOUBLE中沒有SINGLE_PK,選擇過程也會顯示錶SAMPLE_SINGLE中的所有數據。

CREATE TABLE SAMPLE_SINGLE ( 
    SINGLE_PK SMALLINT NOT NULL, 
    SINGLE_NAME VARCHAR(50) CHARACTER SET ISO8859_1 COLLATE ISO8859_1, 
    SINGLE_AMOUNT SMALLINT, 
    SINGLE_QUANTITY SMALLINT); 

CREATE TABLE SAMPLE_DOUBLE (
    DOUBLE_PK SMALLINT NOT NULL, 
    SINGLE_PK SMALLINT, 
    DOUBLE_QUANTITY SMALLINT); 


CREATE PROCEDURE SELECT_FROM2TABLES 
RETURNS(
    SINGLE_NAME VARCHAR(50) CHARACTER SET ISO8859_1 COLLATE ISO8859_1, 
    SINGLE_AMOUNT SMALLINT, 
    SINGLE_QUANTITY SMALLINT, 
    TOTAL_DOUBLE_QUANTITY SMALLINT, 
    REMAINING_QUANTITY SMALLINT) 
AS 
BEGIN 
    FOR 
    SELECT 
     A.SINGLE_NAME, 
     A.SINGLE_AMOUNT, 
     A.SINGLE_QUANTITY, 
     SUM(B.DOUBLE_QUANTITY), 
     A.SINGLE_QUANTITY - SUM(B.DOUBLE_QUANTITY) 

    FROM SAMPLE_SINGLE A, SAMPLE_DOUBLE B 
    WHERE A.SINGLE_PK = B.SINGLE_PK 

    GROUP BY 
    A.SINGLE_NAME, 
     A.SINGLE_AMOUNT, 
     A.SINGLE_QUANTITY 

    INTO 
     :SINGLE_NAME, 
     :SINGLE_AMOUNT, 
     :SINGLE_QUANTITY, 
     :TOTAL_DOUBLE_QUANTITY, 
     :REMAINING_QUANTITY 
    DO 
    BEGIN 
     SUSPEND; 
    END 
END; 

對於此選擇過程只會顯示從具有本表SAMPLE_DOUBLE因爲

FROM SAMPLE_SINGLE A, SAMPLE_DOUBLE B 
     WHERE A.SINGLE_PK = B.SINGLE_PK 

我還要顯示從表A的數據的SINGLE_PK表SAMPLE_SINGLE數據中不存在表B.

這裏是樣本數據,

Table A (SAMPLE_SINGLE) SINGLE_PK SINGLE_NAME SINGLE_AMOUNT SINGLE_QUNATITY 
          1   asdf   100   5 
          2   qwer   50    7 
Table B (SAMPLE_DOUBLE) DOUBLE_PK SINGLE_PK DOUBLE_QUANTITY 
          1   1   3 

我在選擇過程所需的輸出,

SINGLE_NAME SINGLE_AMOUNT SINGLE_QUANTITY TOTAL_DOUBLE_QUANTITY RMAINING_QUANTITY 
    asdf   100   5    3     2 
    qwer   50    7    0     7 

這裏是因爲WHERE A.SINGLE_PK = B.SINGLE_PK,它將只顯示第一行的上述過程的實際結果,

SINGLE_NAME SINGLE_AMOUNT SINGLE_QUANTITY TOTAL_DOUBLE_QUANTITY RMAINING_QUANTITY 
    asdf   100   5    3     2 
+0

Interbase和Firebird不是同一個數據庫系統。在過去的18年中,他們已經發生了很多分歧,所以你不能依靠一個人的回答來申請另一個人。所以選擇:Firebird或者interbase –

回答

2

問題是您使用隱式(SQL-89樣式)連接,並且where中的相等將自動排除B中沒有行的那些行。相反,你需要使用顯式的(SQL-92型)加入,特別是left outer join

左外連接包括所有從左邊組從右側的記錄集,但僅匹配記錄。

所以使用:

FROM SAMPLE_SINGLE A 
LEFT OUTER JOIN SAMPLE_DOUBLE B ON A.SINGLE_PK = B.SINGLE_PK 

Joins看到火鳥2.5語言參考。

+0

謝謝sir mark^_ ^ –

相關問題