2017-05-07 67 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^_ ^ –

相关问题