Sql 找到丢失的记录
三个表以以下方式相互连接:Sql 找到丢失的记录,sql,oracle,Sql,Oracle,三个表以以下方式相互连接: 按员工ID将员工(ID、姓名)与工资(ID、员工ID、供应商ID、总金额、支付日期)进行比较 按供应商ID向供应商(ID,名称)支付的工资(ID,员工ID,供应商ID) 每个员工ID至少有两个供应商。 但是,一个供应商适用于所有员工——“ABC” 我需要一份供应商ABC未付款的员工名单。 例如: Employee Vendor Month Total_amount 123 ABC Jan 150 123 DEF Jan 200 456
按员工ID将员工(ID、姓名)与工资(ID、员工ID、供应商ID、总金额、支付日期)进行比较
按供应商ID向供应商(ID,名称)支付的工资(ID,员工ID,供应商ID)
每个员工ID至少有两个供应商。
但是,一个供应商适用于所有员工——“ABC”
我需要一份供应商ABC未付款的员工名单。
例如:
Employee Vendor Month Total_amount
123 ABC Jan 150
123 DEF Jan 200
456 ABC Jan 150
456 XYZ Jan 250
123 DEF Feb 200
456 ABC Feb 150
456 XYZ Feb 250
我的结果应该是2月的员工ID 123,因为该月没有支付供应商ABC。
Oracle 11g R2架构设置:
CREATE TABLE table_name ( Employee, Vendor, Month, Total_amount ) AS
SELECT 123, 'ABC', 'Jan', 150 FROM DUAL UNION ALL
SELECT 123, 'DEF', 'Jan', 200 FROM DUAL UNION ALL
SELECT 456, 'ABC', 'Jan', 150 FROM DUAL UNION ALL
SELECT 456, 'XYZ', 'Jan', 250 FROM DUAL UNION ALL
SELECT 123, 'DEF', 'Feb', 200 FROM DUAL UNION ALL
SELECT 456, 'ABC', 'Feb', 150 FROM DUAL UNION ALL
SELECT 456, 'XYZ', 'Feb', 250 FROM DUAL;
WITH EVA( Employee, Vendor, Total_Amount ) AS (
SELECT DISTINCT
Employee,
Vendor,
Total_Amount
FROM table_name
),
Months ( Month ) AS (
SELECT DISTINCT MONTH FROM table_name
)
SELECT Employee, Vendor, Month, Total_Amount
FROM EVA CROSS JOIN Months
MINUS
SELECT Employee, Vendor, Month, Total_Amount
FROM table_name
| EMPLOYEE | VENDOR | MONTH | TOTAL_AMOUNT |
|----------|--------|-------|--------------|
| 123 | ABC | Feb | 150 |
查询1:
CREATE TABLE table_name ( Employee, Vendor, Month, Total_amount ) AS
SELECT 123, 'ABC', 'Jan', 150 FROM DUAL UNION ALL
SELECT 123, 'DEF', 'Jan', 200 FROM DUAL UNION ALL
SELECT 456, 'ABC', 'Jan', 150 FROM DUAL UNION ALL
SELECT 456, 'XYZ', 'Jan', 250 FROM DUAL UNION ALL
SELECT 123, 'DEF', 'Feb', 200 FROM DUAL UNION ALL
SELECT 456, 'ABC', 'Feb', 150 FROM DUAL UNION ALL
SELECT 456, 'XYZ', 'Feb', 250 FROM DUAL;
WITH EVA( Employee, Vendor, Total_Amount ) AS (
SELECT DISTINCT
Employee,
Vendor,
Total_Amount
FROM table_name
),
Months ( Month ) AS (
SELECT DISTINCT MONTH FROM table_name
)
SELECT Employee, Vendor, Month, Total_Amount
FROM EVA CROSS JOIN Months
MINUS
SELECT Employee, Vendor, Month, Total_Amount
FROM table_name
| EMPLOYEE | VENDOR | MONTH | TOTAL_AMOUNT |
|----------|--------|-------|--------------|
| 123 | ABC | Feb | 150 |
:
CREATE TABLE table_name ( Employee, Vendor, Month, Total_amount ) AS
SELECT 123, 'ABC', 'Jan', 150 FROM DUAL UNION ALL
SELECT 123, 'DEF', 'Jan', 200 FROM DUAL UNION ALL
SELECT 456, 'ABC', 'Jan', 150 FROM DUAL UNION ALL
SELECT 456, 'XYZ', 'Jan', 250 FROM DUAL UNION ALL
SELECT 123, 'DEF', 'Feb', 200 FROM DUAL UNION ALL
SELECT 456, 'ABC', 'Feb', 150 FROM DUAL UNION ALL
SELECT 456, 'XYZ', 'Feb', 250 FROM DUAL;
WITH EVA( Employee, Vendor, Total_Amount ) AS (
SELECT DISTINCT
Employee,
Vendor,
Total_Amount
FROM table_name
),
Months ( Month ) AS (
SELECT DISTINCT MONTH FROM table_name
)
SELECT Employee, Vendor, Month, Total_Amount
FROM EVA CROSS JOIN Months
MINUS
SELECT Employee, Vendor, Month, Total_Amount
FROM table_name
| EMPLOYEE | VENDOR | MONTH | TOTAL_AMOUNT |
|----------|--------|-------|--------------|
| 123 | ABC | Feb | 150 |
好啊重新思考这一点。我想你需要一个月/年表来显示他们没有支付任何员工工资的月份。ABC向所有员工支付的
金额是否相同?太多未回答的变量。他们每月通过供应商向员工支付工资。是的,金额总是一样的。这就是为什么您需要一个月/年表来查看他们错过了哪个月向员工付款。即使它是您在查询中声明的临时表。因此,我创建了一个月/年表,该表按支付日期连接到薪资表。但是我的查询结果会返回上面所有的记录。因为我只需要一行(2月123日)作为结果,因为这是唯一一个没有向ABC支付工资的行