SQL如何连接两个表

标签 sql

使用下面的代码将表 a 与另外两个表连接起来。

代码

 SELECT DISTINCT
 PY.DEDUCTION_VOUCHER_NO,
 PY.DEDUCTION_PER_PAYRUN,
 COALESCE (SV.EMPLOYEE_CODE,MEM.EMPLOYEE_CODE) AS EMPLOYEE_CODE,
 SV.HOME_AMT_AFTER_TAX,
 SV.PIECE_RATE_GROUP_CODE, 
 SV.SERVICE_CODE,
 SV.SUBJECT_TYPE
 FROM PY_DEDUCTION PY
 LEFT OUTER JOIN PY_DEDUCTION_SERVICE SV ON (PY.DEDUCTION_VOUCHER_NO = SV.DEDUCTION_VOUCHER_NO)
 LEFT OUTER JOIN PY_DEDUCTION_SV_GRP_MEMBER MEM ON (PY.DEDUCTION_VOUCHER_NO = MEM.DEDUCTION_VOUCHER_NO)

Display Table a
SUBJECT_TYPE   PIECE_RATE_GROUP_CODE Employee_code DEDUCTION_VOUCHER_NO  SERVICE_CODE   HOME_AMT_AFTER_TAX   DEDUCTION_PER_PAYRUN
EMP                                     001          D2001               AC01            $50                        $40
GRP                GP1005               001          D2001               AC02            $100                       $80 
GRP                GP1005               002          D2001               AC02            $70                        $20
EMP                                     003          D2233               AC05            $100                       $100

现在需要加入表b。但有些 Deduction_Voucher_No 未包含在表 b

Table b
Payslip_Voucher_NO   Deduction_Voucher_No Employee_code OutStanding_Amount
P1001                 D2001                 001          $10
P1002                 D2001                 001          $20
P1003                 D2001                 002          $50

我尝试应用左外连接,

 SELECT DISTINCT
 PY.DEDUCTION_VOUCHER_NO,
 PY.DEDUCTION_PER_PAYRUN,
 COALESCE (SV.EMPLOYEE_CODE,MEM.EMPLOYEE_CODE) AS EMPLOYEE_CODE,
 SV.HOME_AMT_AFTER_TAX,
 SV.PIECE_RATE_GROUP_CODE, 
 SV.SERVICE_CODE,
 SV.SUBJECT_TYPE,
 tbl.Payslip_Voucher_No,
 tbl.Outstanding_Amount
 FROM PY_DEDUCTION PY
 LEFT OUTER JOIN PY_DEDUCTION_SERVICE SV ON (PY.DEDUCTION_VOUCHER_NO = SV.DEDUCTION_VOUCHER_NO)
 LEFT OUTER JOIN PY_DEDUCTION_SV_GRP_MEMBER MEM ON (PY.DEDUCTION_VOUCHER_NO = MEM.DEDUCTION_VOUCHER_NO)
 LEFT OUTER JOIN table b tlb ON (PY.DEDUCTION_VOUCHER_NO = tbl.DEDUCTION_VOUCHER_NO)

但它显示错误,显示同一 DEDUCTION_VOUCHER_NO 下的所有 payslip_voucher_no

SUBJECT_TYPE   PIECE_RATE_GROUP_CODE Employee_code DEDUCTION_VOUCHER_NO  Payslip_Voucher_NO  SERVICE_CODE   HOME_AMT_AFTER_TAX   DEDUCTION_PER_PAYRUN  OutStanding_Amount
EMP                                     001          D2001               P1001               AC01            $50                        $40               $10
EMP                                     001          D2001               P1002               AC01            $50                        $40               $20
EMP                                     001          D2001               P1003               AC01            $50                        $40               $50

预期结果应该是

SUBJECT_TYPE   PIECE_RATE_GROUP_CODE Employee_code DEDUCTION_VOUCHER_NO  Payslip_Voucher_NO  SERVICE_CODE   HOME_AMT_AFTER_TAX   DEDUCTION_PER_PAYRUN  OutStanding_Amount
EMP                                     001          D2001               P1001               AC01            $50                        $40               $10
GRP                GP1005               001          D2001               P1002               AC02            $100                       $80               $20
GRP                GP1005               002          D2001               P1003               AC02            $70                        $20               $50
EMP                                     003          D2233               empty               AC05            $100                       $100              $0

有什么想法吗?谢谢

最佳答案

 SELECT DISTINCT
 PY.DEDUCTION_VOUCHER_NO,
 PY.DEDUCTION_PER_PAYRUN,
 COALESCE (SV.EMPLOYEE_CODE,MEM.EMPLOYEE_CODE) AS EMPLOYEE_CODE,
 SV.HOME_AMT_AFTER_TAX,
 SV.PIECE_RATE_GROUP_CODE, 
 SV.SERVICE_CODE,
 SV.SUBJECT_TYPE,
 ISNULL(b.OutStanding_Amount, 0) AS OutStanding_Amount -- Add this line
 FROM PY_DEDUCTION PY
 LEFT OUTER JOIN PY_DEDUCTION_SERVICE SV ON (PY.DEDUCTION_VOUCHER_NO = SV.DEDUCTION_VOUCHER_NO)
 LEFT OUTER JOIN PY_DEDUCTION_SV_GRP_MEMBER MEM ON (PY.DEDUCTION_VOUCHER_NO = MEM.DEDUCTION_VOUCHER_NO)
 -- Add this line, I don't know which table contains Payslip_Voucher_NO to avoid unwanted rows
 LEFT OUTER JOIN TableB b ON 
 (
     PY.DEDUCTION_VOUCHER_NO = b.DEDUCTION_VOUCHER_NO 
     AND ??.Payslip_Voucher_NO = b.Payslip_Voucher_NO
     AND COALESCE (SV.EMPLOYEE_CODE,MEM.EMPLOYEE_CODE) = b.EMPLOYEE_CODE
 )  

关于SQL如何连接两个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31333655/

相关文章:

mysql - 这个函数是否符合 ANSI SQL 标准?

mysql - 如何将 MySQL 偏移量作为具有别名的列?

mysql - 优化这段 MYSQL 代码以获得更好的执行时间

sql - T-SQL ORDER BY 根据条件

sql - 如何在删除重复项的同时合并具有不同列号的两个表?

mysql - 在和或之间选择

java - 是否有用于将谓词定义为类似 SQL 的字符串的 Java 库?

sql - Azure Sql Server 无法使用检查约束和触发器保持数据一致性

mysql - mysql中两个相同表的区别

python - 内部加入 Django 1.9