postgresql 希望在sql中应用一种条件左连接

uplii1fm  于 2023-02-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(128)

我有两个表t1和t2,它们都有两列。两个表都包含客户及其交易数据。因此,我需要t1中存在但t2中不存在的所有客户和交易代码。但我只需要那些在t2中至少有一个交易可用的客户的这些输出。
t1:-
| 客户代码1|代码转换_1|
| - ------|- ------|
| 1个|项目a|
| 1个|B|
| 1个|(c)秘书长的报告|
| 1个|日|
| 1个|电子|
| 第二章|项目a|
| 第二章|B|
| 第二章|(c)秘书长的报告|
| 三个|我|
| 三个|j|
| 三个|k|
| 三个|升|
| 。|。|
| 。|。|
| 。|。|
| 。|。|
t2:-
| 客户代码2|代码转换_2|
| - ------|- ------|
| 1个|项目a|
| 1个|B|
| 1个|(c)秘书长的报告|
| 第二章|B|

t1 sql脚本:

CREATE TABLE t1 
(
    cust_code_1 VARCHAR(512),
    trans_code_1    VARCHAR(512)
);

INSERT INTO t1 (cust_code_1, trans_code_1) VALUES ('1', 'a');
INSERT INTO t1 (cust_code_1, trans_code_1) VALUES ('1', 'b');
INSERT INTO t1 (cust_code_1, trans_code_1) VALUES ('1', 'c');
INSERT INTO t1 (cust_code_1, trans_code_1) VALUES ('1', 'd');
INSERT INTO t1 (cust_code_1, trans_code_1) VALUES ('1', 'e');
INSERT INTO t1 (cust_code_1, trans_code_1) VALUES ('2', 'a');
INSERT INTO t1 (cust_code_1, trans_code_1) VALUES ('2', 'b');
INSERT INTO t1 (cust_code_1, trans_code_1) VALUES ('2', 'c');
INSERT INTO t1 (cust_code_1, trans_code_1) VALUES ('3', 'i');
INSERT INTO t1 (cust_code_1, trans_code_1) VALUES ('3', 'j');
INSERT INTO t1 (cust_code_1, trans_code_1) VALUES ('3', 'k');
INSERT INTO t1 (cust_code_1, trans_code_1) VALUES ('3', 'l');
INSERT INTO t1 (cust_code_1, trans_code_1) VALUES ('.', '.');
INSERT INTO t1 (cust_code_1, trans_code_1) VALUES ('.', '.');
INSERT INTO t1 (cust_code_1, trans_code_1) VALUES ('.', '.');
INSERT INTO t1 (cust_code_1, trans_code_1) VALUES ('.', '.');

t2 sql脚本:

CREATE TABLE t2 
(
    cust_code_2 VARCHAR(512),
    trans_code_2    VARCHAR(512)
);

INSERT INTO t2 (cust_code_2, trans_code_2) VALUES ('1', 'a');
INSERT INTO t2 (cust_code_2, trans_code_2) VALUES ('1', 'b');
INSERT INTO t2 (cust_code_2, trans_code_2) VALUES ('1', 'c');
INSERT INTO t2 (cust_code_2, trans_code_2) VALUES ('2', 'b');

预期产出

| 客户代码1|代码转换_1|客户代码2|代码转换_2|
| - ------|- ------|- ------|- ------|
| 1个|日|零|零|
| 1个|电子|零|零|
| 第二章|项目a|零|零|
| 第二章|(c)秘书长的报告|零|零|

正在获取的输出

| 客户代码1|代码转换_1|客户代码2|代码转换_2|
| - ------|- ------|- ------|- ------|
| 1个|日|零|零|
| 1个|电子|零|零|
| 第二章|项目a|零|零|
| 第二章|(c)秘书长的报告|零|零|
| 三个|我|零|零|
| 三个|j|零|零|
| 三个|k|零|零|
| 三个|升|零|零|
| 。|。|。|。|
| 。|。|。|。|
| 。|。|。|。|

所尝试的操作已离开联接的t1和t2查询-

select * from t1 left join t2 on t1.cust_code_1=t2.cust_code_2
         and t1.trans_code_1=t2.trans_code_2 
         where t2.cust_code_2 is null

我的实际问题这里,我不希望输出cust_code_1=3。基本上,我希望输出左连接,但cust_code_2应该可用。因为我有数百万条记录,但我只需要那些在t2中不可用的Cust code=1和Cust code=2的事务。

仅供参考-我的数据库支持PostgreSQL。
请帮助我获得以下输出。

fkaflof6

fkaflof61#

您可以只通过在where子句中附加以下条件来过滤掉不需要的记录:

and t1.cust_code_1 in (select tt2.cust_code_2 from t2 as tt2);

因此,您的结果将仅包含在cust_code_2列中具有值的记录。
下面是完整的sql:

select * 
from t1 left join t2 on t1.cust_code_1 = t2.cust_code_2
and t1.trans_code_1 = t2.trans_code_2 
where t2.cust_code_2 is null 
    and t1.cust_code_1 in (select tt2.cust_code_2 from t2 as tt2);

您可以在这个SQL Fiddle中尝试一下。

相关问题