SQL-连接两个表,每个表有一个键,但需要特定的结果
我有两个表,一个键上有一个连接。我每张桌子上只有一把钥匙。如果可能的话,请帮助我获得预期的结果。谢谢 嗨,我有这张桌子,上面有钥匙:SQL-连接两个表,每个表有一个键,但需要特定的结果,sql,oracle10g,Sql,Oracle10g,我有两个表,一个键上有一个连接。我每张桌子上只有一把钥匙。如果可能的话,请帮助我获得预期的结果。谢谢 嗨,我有这张桌子,上面有钥匙: SETTLE DT FUND DEPTID PGM CLASS ACCT PROJECT ID BUD REF FY EMPLID AMOUNT AMOUNT1 AMOUNT ALL 9/1/2017 21000 5066000 32000 1290
SETTLE DT FUND DEPTID PGM CLASS ACCT PROJECT ID BUD REF FY EMPLID AMOUNT AMOUNT1 AMOUNT ALL
9/1/2017 21000 5066000 32000 12900 512001 304421850 072017 2017 000015034 1094.51 1094.51 1094.51
9/15/2017 21000 5066000 32000 12900 512001 304421850 072017 2017 000015034 2189.01 2689.01 2689.01
9/15/2017 21000 5066000 10001 11000 512001 500751850 072017 2017 000015034 500 2689.01 2689.01
使用键检查DT连接到此表:
NAME EMPLID GROSS BEN PLAN EMPLYE SUR PAY END DT CHECK DT EMPLYR SUR NAME SEC RUN ID
Jones Rosie 000015034 250 SUR2 SURS 20 8/19/2017 9/15/2017 31.15 Jones Rosie 5 1719
Jones Rosie 000015034 250 SUR2 SURS 20 9/2/2017 9/15/2017 31.15 Jones Rosie 5 1719
Jones Rosie 000015034 1851.13 SUR2 SURS 148.09 9/2/2017 9/15/2017 230.65 Jones Rosie 5 1719
此sql返回以下结果:
SELECT
z.name
,z.emplid
,z.ssn
,z.gross_amt
,z.benefit_plan
,z.z_employee_surs
,z.pay_end_dt
,z.check_date
,ROUND(z_employer_surs,2)
,x.fund_code
,x.deptid
,x.program_code
,x.class_fld
,x.account
,x.project_id
,x.budget_ref
,x.amount
,x.z_amount_all
,ROUND((z.z_employer_surs * (x.amount/x.z_amount_all)),2)
,z.name_display
,z.z_campus
,x.settlement_dt
,z.RUN_ID
FROM PS_Z_SURS_HR_WK z,
PS_Z_SURS_JRNL_WK x
WHERE z.emplid = x.emplid
AND z.emplid = '000015034'
AND z.check_date = x.settlement_dt
and x.project_id IN ('500751850', '304421850')
AND x.budget_ref = '072017';
--这就是我得到的
NAME EMPLID GROSS BEN PL EMPLE SUR PAY END DT CHECK DT EMPLYR SUR FUND DEPTID PRGM CLASS ACCT PROJECT
Jones Rosie 000015034 1829.13 SUR2 146.33 8/19/2017 9/1/2017 227.91 21000 5066000 32000 12900 512001 304421850
Jones Rosie 000015034 250 SUR2 20 8/19/2017 9/15/2017 31.15 21000 5066000 32000 12900 512001 304421850
Jones Rosie 000015034 250 SUR2 20 9/2/2017 9/15/2017 31.15 21000 5066000 32000 12900 512001 304421850
Jones Rosie 000015034 1851.13 SUR2 148.09 9/2/2017 9/15/2017 230.65 21000 5066000 32000 12900 512001 304421850
Jones Rosie 000015034 250 SUR2 20 8/19/2017 9/15/2017 31.15 21000 5066000 10001 11000 512001 500751850
Jones Rosie 000015034 250 SUR2 20 9/2/2017 9/15/2017 31.15 21000 5066000 10001 11000 512001 500751850
Jones Rosie 000015034 1851.13 SUR2 148.09 9/2/2017 9/15/2017 230.65 21000 5066000 10001 11000 512001 500751850
--但这正是我想要的
NAME EMPLID GROSS BEN PL EMPLE SUR PAY END DT CHECK DT EMPLYR SUR FUND DEPTID PRGM CLASS ACCT PROJECT
Jones Rosie 000015034 1829.13 SUR2 146.33 8/19/2017 9/1/2017 227.91 21000 5066000 32000 12900 512001 304421850
Jones Rosie 000015034 1851.13 SUR2 148.09 9/2/2017 9/15/2017 230.65 21000 5066000 32000 12900 512001 304421850
Jones Rosie 000015034 250 SUR2 20 8/19/2017 9/15/2017 31.15 21000 5066000 10001 11000 512001 500751850
Jones Rosie 000015034 250 SUR2 20 9/2/2017 9/15/2017 31.15 21000 5066000 10001 11000 512001 500751850
谢谢 我认为EmployeeID和Date不是主键,所以当您连接这两个表时,您会得到值的组合。 您应该按项目id对数据进行分组 铌
在这种情况下,select中的列必须使用聚合函数,例如max(z.name)第一个表中有两行具有相同的结算日期和相同的员工id 因此,当您连接到另一个表时,您将连接到这两行的所有3行。这将为您提供2倍的3或6个结果行
如果您只需要3行,则需要在第一个表中找出另一个筛选器,以便只提供一行—例如
PGM=32000
,并将其添加到where子句中。谢谢大家的输入。结果证明,结果集就是我想要的结果,用户确认了这一点。这里的问题是,如果项目id在第二个表上,两个表上都没有第二个键来生成我期望的结果 我需要更多关于PKs和FKST的信息。这与主键无关。我想你的意思是它不是独一无二的。这是正确的,EmployeeID和日期在第一个表中不是唯一的。