Sql 在另一个表中计算表的一个字段

Sql 在另一个表中计算表的一个字段,sql,oracle,Sql,Oracle,我用甲骨文写了一个脚本。但它并没有给我想要的结果。 我需要这个,想象一下我有两张桌子。订桌子和书桌。 我的订单是这样的 订单表格 ID TYPE_ID VALUE_ID 1 11 null 2 11 null 3 11 null 4 12 null 5 11 null 书桌 ID ORDER_TYPE DELETED 1 1 F 2 null

我用甲骨文写了一个脚本。但它并没有给我想要的结果。 我需要这个,想象一下我有两张桌子。订桌子和书桌。 我的订单是这样的

订单表格

ID  TYPE_ID   VALUE_ID 
1    11       null
2    11       null
3    11       null
4    12       null
5    11       null
书桌

ID  ORDER_TYPE    DELETED
1      1         F
2      null      F
3      5         F
4      5         F
5      4         F
6      4         F
7      3         T
我的剧本是这样的

Select *
From (
  Select Newtable.Counter As Value_id,
         o.Id As Id,
         o.Type_id As Type_id
  From   (
           Select (Count B.Order_Type) As Counter, 
                  B.Order_Type As Id
           From   Book B
           Where  B.Deleted = 'F'
           Group By B.Order_Type
           Order By Count(B.Order_Type) Desc
         ) newtable,
         order_table o
  where  o.id = newtable.id
  and    o.type_id = 11
)
order by id asc;
结果是这样的

Value_ID TYPE_ID ID
2          11     5
2          11     4
1          11     1
Value_ID TYPE_ID ID
2          11     5
2          11     4
1          11     1
0          11     2
0          11     3
它没有显示第二个和第三个id有0个计数,我可以显示0个计数吗

结果应该是这样

Value_ID TYPE_ID ID
2          11     5
2          11     4
1          11     1
Value_ID TYPE_ID ID
2          11     5
2          11     4
1          11     1
0          11     2
0          11     3

首先,不要使用隐式
JOIN
语法(逗号分隔),这是很难发现这些错误的原因之一!使用正确的
JOIN
语法

其次,您的问题是需要
左连接
,而不是
内部连接
,因此请尝试以下操作:

Select *
  From  (Select coalesce(Newtable.Counter,0) As Value_id,
                o.Id             As Id,
                o.Type_id        As Type_id
         From order_table o
         LEFT JOIN (Select Count(B.Order_Type) As Counter, B.Order_Type As Id
                    From Book B
                    Where B.Deleted = 'F'
                    Group By B.Order_Type
                    Order By Count(B.Order_Type) Desc) newtable
           ON(o.id = newtable.id)
         WHERE o.type_id = 11)
 order by id asc;

Oracle安装程序

CREATE TABLE order_table ( id, type_id, value_id ) AS
SELECT 1, 11, CAST( NULL AS INT ) FROM DUAL UNION ALL
SELECT 2, 11, CAST( NULL AS INT ) FROM DUAL UNION ALL
SELECT 3, 11, CAST( NULL AS INT ) FROM DUAL UNION ALL
SELECT 4, 12, CAST( NULL AS INT ) FROM DUAL UNION ALL
SELECT 5, 11, CAST( NULL AS INT ) FROM DUAL;

CREATE TABLE book ( id, order_type, deleted ) AS
SELECT 1, 1, 'F' FROM DUAL UNION ALL
SELECT 2, NULL, 'F' FROM DUAL UNION ALL
SELECT 3, 5, 'F' FROM DUAL UNION ALL
SELECT 4, 5, 'F' FROM DUAL UNION ALL
SELECT 5, 4, 'F' FROM DUAL UNION ALL
SELECT 6, 4, 'F' FROM DUAL UNION ALL
SELECT 7, 3, 'T' FROM DUAL;
SELECT COUNT( b.order_type ) AS value_id,
       o.id,
       o.order_type
FROM   order_table o
       LEFT OUTER JOIN
       book b
       ON ( o.id = b.order_type AND b.deleted = 'F' )
WHERE  o.type_id = 11
GROUP BY o.id, o.type_id
ORDER BY value_id DESC, id DESC;
VALUE_ID ID TYPE_ID
-------- -- -------
       2  5      11
       1  1      11
       0  3      11
       0  2      11
查询

CREATE TABLE order_table ( id, type_id, value_id ) AS
SELECT 1, 11, CAST( NULL AS INT ) FROM DUAL UNION ALL
SELECT 2, 11, CAST( NULL AS INT ) FROM DUAL UNION ALL
SELECT 3, 11, CAST( NULL AS INT ) FROM DUAL UNION ALL
SELECT 4, 12, CAST( NULL AS INT ) FROM DUAL UNION ALL
SELECT 5, 11, CAST( NULL AS INT ) FROM DUAL;

CREATE TABLE book ( id, order_type, deleted ) AS
SELECT 1, 1, 'F' FROM DUAL UNION ALL
SELECT 2, NULL, 'F' FROM DUAL UNION ALL
SELECT 3, 5, 'F' FROM DUAL UNION ALL
SELECT 4, 5, 'F' FROM DUAL UNION ALL
SELECT 5, 4, 'F' FROM DUAL UNION ALL
SELECT 6, 4, 'F' FROM DUAL UNION ALL
SELECT 7, 3, 'T' FROM DUAL;
SELECT COUNT( b.order_type ) AS value_id,
       o.id,
       o.order_type
FROM   order_table o
       LEFT OUTER JOIN
       book b
       ON ( o.id = b.order_type AND b.deleted = 'F' )
WHERE  o.type_id = 11
GROUP BY o.id, o.type_id
ORDER BY value_id DESC, id DESC;
VALUE_ID ID TYPE_ID
-------- -- -------
       2  5      11
       1  1      11
       0  3      11
       0  2      11
输出

CREATE TABLE order_table ( id, type_id, value_id ) AS
SELECT 1, 11, CAST( NULL AS INT ) FROM DUAL UNION ALL
SELECT 2, 11, CAST( NULL AS INT ) FROM DUAL UNION ALL
SELECT 3, 11, CAST( NULL AS INT ) FROM DUAL UNION ALL
SELECT 4, 12, CAST( NULL AS INT ) FROM DUAL UNION ALL
SELECT 5, 11, CAST( NULL AS INT ) FROM DUAL;

CREATE TABLE book ( id, order_type, deleted ) AS
SELECT 1, 1, 'F' FROM DUAL UNION ALL
SELECT 2, NULL, 'F' FROM DUAL UNION ALL
SELECT 3, 5, 'F' FROM DUAL UNION ALL
SELECT 4, 5, 'F' FROM DUAL UNION ALL
SELECT 5, 4, 'F' FROM DUAL UNION ALL
SELECT 6, 4, 'F' FROM DUAL UNION ALL
SELECT 7, 3, 'T' FROM DUAL;
SELECT COUNT( b.order_type ) AS value_id,
       o.id,
       o.order_type
FROM   order_table o
       LEFT OUTER JOIN
       book b
       ON ( o.id = b.order_type AND b.deleted = 'F' )
WHERE  o.type_id = 11
GROUP BY o.id, o.type_id
ORDER BY value_id DESC, id DESC;
VALUE_ID ID TYPE_ID
-------- -- -------
       2  5      11
       1  1      11
       0  3      11
       0  2      11
但是,如果您确实希望使用传统的Oracle逗号连接语法,则可以通过以下方式获得相同的结果:

SELECT COUNT( b.order_type ) AS value_id,
       o.id,
       o.order_type
FROM   order_table o,
       book b
WHERE  o.type_id        = 11
AND    b.order_type (+) = o.id
AND    b.deleted    (+) = 'F'
GROUP BY o.id, o.type_id
ORDER BY value_id DESC, id DESC;

但是请不要这样做,因为ANSI/ISO联接更容易理解联接条件。

您也可以使用标量子查询来实现这一点,与其他答案中描述的左联接版本相比,标量子查询的性能可能会更高,也可能不会更高。(很可能优化器会将其重写为左连接!):


order_表和book_表之间的关系是什么?此查询是否比上一个@sagi查询快?谢谢你的帮助。脚本解决了我的问题:)@Jo_bast应该没什么大区别。没问题:)他数错了,没注意到。固定@MT0