Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在SELECT语句中填写缺少的值_Sql_Mysql_Sql Server_Oracle - Fatal编程技术网

Sql 在SELECT语句中填写缺少的值

Sql 在SELECT语句中填写缺少的值,sql,mysql,sql-server,oracle,Sql,Mysql,Sql Server,Oracle,我有一个表,有两列,客户id和订单。 假设我总共有顺序ID 1,2,3,4 所有客户都可以获得所有四个订单,如下所示: 1234 1 1234 2 1234 3 1234 4 3245 3 3245 4 5436 2 5436 4 您可以在上面看到,3245客户没有订单id 1或2。 如何打印查询输出,如: 3245 1 3245 2 5436 1 5436 3 编辑:我没有订单表,但我有一个订单列表,就像我们可以在查询1,2,

我有一个表,有两列,客户id和订单。 假设我总共有顺序ID 1,2,3,4

所有客户都可以获得所有四个订单,如下所示:

    1234 1
    1234 2
    1234 3
    1234 4
    3245 3
    3245 4
    5436 2
    5436 4
您可以在上面看到,3245客户没有订单id 1或2。 如何打印查询输出,如:

3245 1
3245 2
5436 1
5436 3
编辑:我没有订单表,但我有一个订单列表,就像我们可以在查询1,2,3,4中硬编码一样

如果有customers表,它会变得更简单:

SELECT  c.id, o.order
FROM    (
        SELECT  1 AS order
        UNION ALL
        SELECT  2 AS order
        UNION ALL
        SELECT  3 AS order
        UNION ALL
        SELECT  4 AS order
        ) o
CROSS JOIN
        customers c
WHERE   NOT EXISTS
        ( 
        SELECT  NULL
        FROM    customer_orders ci
        WHERE   ci.id = c.id
                AND ci.order = o.order
        )
如果有customers表,它会变得更简单:

SELECT  c.id, o.order
FROM    (
        SELECT  1 AS order
        UNION ALL
        SELECT  2 AS order
        UNION ALL
        SELECT  3 AS order
        UNION ALL
        SELECT  4 AS order
        ) o
CROSS JOIN
        customers c
WHERE   NOT EXISTS
        ( 
        SELECT  NULL
        FROM    customer_orders ci
        WHERE   ci.id = c.id
                AND ci.order = o.order
        )

除了我的评论和你现有的表格之外,我会这样做

select distinct
      a.Customer,
      b.OrderNumber
   from
      YourOrderTable a,
      ( select distinct OrderNumber from YourOrderTable ) b
   where 
      b.OrderNumber NOT IN
          ( select OrderNumber from
                YourOrderTable c
                where a.Customer = c.Customer
                  and b.OrderNumber = c.OrderNumber )
通过在FROM子句中执行select distinct作为第二个表,并且没有特定的联接,您将获得笛卡尔联接。。。ie:对于每个客户,它将加入到每个可能的订单号中

然后,在WHERE子句中,NOT in SQL测试将只允许b。SQL子选择c中不存在的订单号


这可能是一个非常昂贵的查询,尤其是如果您有许多独特的订单。

除了我的评论和您现有的表之外,我会采用类似的方法

select distinct
      a.Customer,
      b.OrderNumber
   from
      YourOrderTable a,
      ( select distinct OrderNumber from YourOrderTable ) b
   where 
      b.OrderNumber NOT IN
          ( select OrderNumber from
                YourOrderTable c
                where a.Customer = c.Customer
                  and b.OrderNumber = c.OrderNumber )
通过在FROM子句中执行select distinct作为第二个表,并且没有特定的联接,您将获得笛卡尔联接。。。ie:对于每个客户,它将加入到每个可能的订单号中

然后,在WHERE子句中,NOT in SQL测试将只允许b。SQL子选择c中不存在的订单号


这可能是一个非常昂贵的查询,特别是如果您有许多独特的订单。

好的,这里有两个问题。第一个问题是将数字列表转换为行集。有许多不同的方法可以实现这一点,具体取决于您如何将数字输入查询中。在下面的示例中,我使用了一个函数,该函数将逗号分隔的字符串转换为嵌套表,该嵌套表可以通过table函数视为常规表。这与你提出的问题并不完全相关。如果您对这一点的实现感兴趣,请参阅

问题的第二部分是识别每个客户的缺失订单。显而易见的方法——比如在子查询中使用NOT IN——是行不通的,因为Customer 1234的订单与所有订单ID都匹配。我们需要做的是为每位客户填写缺失的订单。这可以通过结合使用左外部联接和partitionby子句来实现。然后,通过将LOJ查询嵌入到外部SELECT中来过滤命中,这很简单,如下所示:

SQL> select customer_id
  2         , missing_order_id
  3  from (
  4      select t42.customer_id
  5             , t42.order_id
  6             , nos.column_value as missing_order_id
  7      from  ( select * from table  (str_to_number_tokens('1,2,3,4'))) nos
  8      left outer join t42 partition by ( t42.customer_id )
  9      on nos.column_value = t42.order_id
 10      )
 11  where order_id is null
 12  /

CUSTOMER_ID MISSING_ORDER_ID
----------- ----------------
       3245                1
       3245                2
       5436                1
       5436                3

SQL>

好的,这里有两个问题。第一个问题是将数字列表转换为行集。有许多不同的方法可以实现这一点,具体取决于您如何将数字输入查询中。在下面的示例中,我使用了一个函数,该函数将逗号分隔的字符串转换为嵌套表,该嵌套表可以通过table函数视为常规表。这与你提出的问题并不完全相关。如果您对这一点的实现感兴趣,请参阅

问题的第二部分是识别每个客户的缺失订单。显而易见的方法——比如在子查询中使用NOT IN——是行不通的,因为Customer 1234的订单与所有订单ID都匹配。我们需要做的是为每位客户填写缺失的订单。这可以通过结合使用左外部联接和partitionby子句来实现。然后,通过将LOJ查询嵌入到外部SELECT中来过滤命中,这很简单,如下所示:

SQL> select customer_id
  2         , missing_order_id
  3  from (
  4      select t42.customer_id
  5             , t42.order_id
  6             , nos.column_value as missing_order_id
  7      from  ( select * from table  (str_to_number_tokens('1,2,3,4'))) nos
  8      left outer join t42 partition by ( t42.customer_id )
  9      on nos.column_value = t42.order_id
 10      )
 11  where order_id is null
 12  /

CUSTOMER_ID MISSING_ORDER_ID
----------- ----------------
       3245                1
       3245                2
       5436                1
       5436                3

SQL>

因此,你实际上是在寻找差距,即:那些没有给定订单号的差距。您是否有所有客户都应该拥有的订单号主列表?听起来不太对。因为如果你有一个客户来过一次,而另一个客户来过100多次,你不希望每个人都有100多个订单。你想查看那些没有链接到这些订单的客户吗?这里..一个客户最多只能有4个订单,没有一个订单是由一个客户两次完成的。我主要需要在1,2,3,4中的客户和他们没有订购的订单。你有客户表吗?那你是什么实际上寻找的是差距,即:那些没有给定的订单号。您是否有所有客户都应该拥有的订单号主列表?听起来不太对。因为如果你有一个客户来过一次,而另一个客户来过100多次,你不希望每个人都有100多个订单。你想查看与这些订单没有关联的客户吗?这里..一个客户最多只能有4个订单,没有一个订单是由一个客户两次完成的。我主要需要1,2,3,4中的客户和他们没有订购的订单。你有客户表吗?我只有4个这正是我所需要的。顺便说一句,我得到了预期的产量,但你能帮我吗
请解释查询的何处部分?@benjamin:该查询使用交叉联接构建所有可能的客户/订单组合,然后使用“不存在”筛选它们,只返回那些在客户订单中不匹配的。太好了。这正是我需要的。BYW我得到了预期的输出,但你能解释一下查询的何处部分吗?@benjamin:查询使用交叉连接构建所有可能的客户/订单组合,然后使用“不存在”筛选它们,仅返回与客户订单不匹配的订单。