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支付工资的行