【问题标题】:SQL Join two query having different number of columnsSQL加入具有不同列数的两个查询
【发布时间】:2015-05-19 14:49:58
【问题描述】:

第一次查询:(为了简化,我加了count(*))

select count(*) from Sales_order_line sol
where
sol.grant_type_id is null
AND
 sol.quantity  - NVL ((SELECT SUM (salesorder15_.assigned_quantity) FROM license_link_sales_ord_ln salesorder15_  
 WHERE salesorder15_.sales_order_line_id = sol.ID),0) > 0;

第二次查询:(为了简化,我加了count(*))

select count(*) from Sales_order_line sol
INNER JOIN license_link_sales_ord_ln sola
ON sol.id=sola.sales_order_line_id
where
sol.grant_type_id is null;

第一个查询返回 56119,第二个查询返回 362260。我想组合得到 (56119 +362260) 作为结果的查询。

【问题讨论】:

  • 所以你要OR这两个查询。你确定结果是不同的吗?如果 both 查询返回任何 Sales_order_lineOR 将返回 less 行。
  • 您的意思是 56119 + 362260 的总和还是字面意义上的“(56119 + 362260)”?另外您使用的是什么 DBMS?
  • 目的不是减少行数。它应该能够从第一个查询和第二个查询中获取所有行。 count(*) 只是为了简化,它实际上获取了许多行。
  • 您能否提供示例数据和您的预期输出?我真的不知道你想达到什么目的
  • 您可以这样描绘查询:select sol.ID , sol.sales_customer_name ,sol.sales_customer_number ,sol.sales_order_number from Sales_order_line sol where sol.grant_type_id is null AND sol.quantity - NVL (( SELECT SUM (salesorder15_.assigned_quantity) FROM license_link_sales_ord_ln salesorder15_ WHERE salesorder15_.sales_order_line_id = sol.ID),0) > 0;

标签: sql database join


【解决方案1】:

要将查询与不同数量的列联合在一起,您需要用 null 填充不相同的列(在两个查询中都不匹配),如下所示:

SELECT columnA, columnB, columnC, columnD, columnE
FROM Sales_order_line s
WHERE s.grant_type_id IS NULL
AND s.quantity  - NVL ((SELECT SUM (so.assigned_quantity) 
                        FROM license_link_sales_ord_ln so
                        WHERE so.sales_order_line_id = s.ID),0) > 0
UNION ALL
SELECT columnA, columnB, columnC, null, null
FROM Sales_order_line s
INNER JOIN license_link_sales_ord_ln l ON s.id = l.sales_order_line_id
WHERE s.grant_type_id IS NULL;

【讨论】:

    【解决方案2】:

    使用UNION ALL

    SELECT count(*) 
    FROM Sales_order_line s
    WHERE s.grant_type_id IS NULL
    AND s.quantity  - NVL ((SELECT SUM (so.assigned_quantity) 
                            FROM license_link_sales_ord_ln so
                            WHERE so.sales_order_line_id = s.ID),0) > 0
    UNION ALL
    SELECT count(*)
    FROM Sales_order_line s
    INNER JOIN license_link_sales_ord_ln l ON s.id = l.sales_order_line_id
    WHERE s.grant_type_id IS NULL;
    

    【讨论】:

    • 问题是两个查询返回不同的列,例如第一个查询返回 10,第二个返回 15。
    • 如果没有 UNION ALL 选项,是否还有其他方法可以实现这一点。我希望通过某种联接来更改查询。
    • 对于额外的列,使用null AS column name 使它们均匀
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多