Select 创建多字段行以显示列表中缺少的项目

Select to create multi-field row showing items missing from list

这听起来与其他问题类似,但我已尝试(未成功)调整它们...Oracle 数据库,如果这很重要的话。 我们的销售人员被分配了 NORTHEASTSOUTHWEST 区域(1、2、3 或全部 4)的任意组合。我想创建一个 table 来显示缺少的内容。所以,table sales_regions 成立:

SELECT user, region, current    
FROM sales_regions    
WHERE region IN ('NORTH','EAST','SOUTH','WEST');


USER      REGION   CURRENT
---- -
U1        EAST     Y    
U1        SOUTH    Y    
U2        NORTH    Y    
U3        NORTH    Y    
U3        EAST     Y    
U3        SOUTH    Y    
U3        WEST     Y

我正在尝试提出一个查询,该查询将生成一个列表,当与现有列表结合使用时,将为每个销售人员提供每个区域:

USER      REGION   CURRENT    
U1        WEST     N    
U1        NORTH    N    
U2        EAST     N    
U2        SOUTH    N    
U2        WEST     N

旧的 post,只包含 1 个字段,有解决方案:

SELECT v.fruit FROM (    
    SELECT 'apple' AS fruit    
    UNION ALL    
    SELECT 'banana'    
    UNION ALL    
    SELECT 'carrot') v    
LEFT JOIN friuttable ft ON ft.fruit = v.fruit    
    WHERE ft.fruit IS NULL

这看起来很接近 - 但我无法使多字段查询工作...

您可以创建一个结果集来保存不同销售人员和地区的每个组合:

SELECT t1.user, t2.region
FROM (SELECT DISTINCT user FROM sales_region) t1
    ,(SELECT DISTINCT region FROM sales_region) t2;

然后您可以使用集合运算符 MINUS 来获得此 table 和您的 table:

之间的区别
SELECT t1.user, t2.region
FROM (SELECT DISTINCT user FROM sales_region) t1
    ,(SELECT DISTINCT region FROM sales_region) t2
MINUS
SELECT user, region 
FROM sales_region;

那应该吐出一个 table,它只有 user/region 组合,而这些组合在您的 sales_region table 中并不存在。

试试这个:

    WITH sales_regions AS (
  SELECT 'U1' AS username, 'EAST' AS region, 'Y' AS CURRENT_ from dual UNION ALL 
  SELECT 'U1' AS username, 'SOUTH' AS region, 'Y' AS CURRENT_ from dual UNION ALL 
  SELECT 'U2' AS username, 'NORTH' AS region, 'Y' AS CURRENT_ from dual UNION ALL 
  SELECT 'U3' AS username, 'EAST' AS region, 'Y' AS CURRENT_ from dual UNION ALL 
  SELECT 'U3' AS username, 'SOUTH' AS region, 'Y' AS CURRENT_ from dual UNION ALL 
  SELECT 'U3' AS username, 'NORTH' AS region, 'Y' AS CURRENT_ from dual UNION ALL 
  SELECT 'U3' AS username, 'WEST' AS region, 'Y' AS CURRENT_ from dual ),
  users AS (
    SELECT 'U1' AS username FROM dual UNION ALL
    SELECT 'U2' AS username FROM dual UNION ALL
    SELECT 'U3' AS username FROM dual),
  regions AS (
    SELECT 'EAST' AS region FROM dual UNION ALL
    SELECT 'SOUTH' AS region FROM dual UNION ALL
    SELECT 'NORTH' AS region FROM dual UNION ALL
    SELECT 'WEST' AS region FROM dual
  )
  SELECT u.username, r.region, 'N' AS current_
  FROM users u JOIN regions r ON 1=1
  LEFT JOIN sales_regions sr ON u.username = sr.username AND r.region = sr.region
  WHERE sr.username IS NULL 

或减号运算符,如果记录是唯一的或不是,但您希望它们是:

    WITH sales_regions AS (
  SELECT 'U1' AS username, 'EAST' AS region, 'Y' AS CURRENT_ from dual UNION ALL 
  SELECT 'U1' AS username, 'SOUTH' AS region, 'Y' AS CURRENT_ from dual UNION ALL 
  SELECT 'U2' AS username, 'NORTH' AS region, 'Y' AS CURRENT_ from dual UNION ALL 
  SELECT 'U3' AS username, 'EAST' AS region, 'Y' AS CURRENT_ from dual UNION ALL 
  SELECT 'U3' AS username, 'SOUTH' AS region, 'Y' AS CURRENT_ from dual UNION ALL 
  SELECT 'U3' AS username, 'NORTH' AS region, 'Y' AS CURRENT_ from dual UNION ALL 
  SELECT 'U3' AS username, 'WEST' AS region, 'Y' AS CURRENT_ from dual ),
  users AS (
    SELECT 'U1' AS username FROM dual UNION ALL
    SELECT 'U2' AS username FROM dual UNION ALL
    SELECT 'U3' AS username FROM dual),
  regions AS (
    SELECT 'EAST' AS region FROM dual UNION ALL
    SELECT 'SOUTH' AS region FROM dual UNION ALL
    SELECT 'NORTH' AS region FROM dual UNION ALL
    SELECT 'WEST' AS region FROM dual
  )
  SELECT username, region, 'N' AS current_
  FROM (
    SELECT u.username, r.region
    FROM users u JOIN regions r ON 1=1
    MINUS
    SELECT sr.username, sr.region
    FROM sales_regions sr ) t

希望对您有所帮助!

PS: 请避免使用关键字作为对象或列名!