如何将两个查询的结果合并到一个数据集中

Posted

技术标签:

【中文标题】如何将两个查询的结果合并到一个数据集中【英文标题】:How to combine results of two queries into a single dataset 【发布时间】:2013-03-05 17:31:55 【问题描述】:

我有两个疑问: 查询简化,不包括联接

Query 1 : select ProductName,NumberofProducts (in inventory) from Table1.....;
Query 2 : select ProductName, NumberofProductssold from Table2......;

我想知道如何获得如下输出:

ProductName NumberofProducts(in inventory)  ProductName NumberofProductsSold

用于获取每个查询的输出的关系是不同的。 我的 s-s-rS 报告需要这种方式的输出。

(我尝试了 union 语句,但它对我想看到的输出不起作用。)

【问题讨论】:

您能否举例说明 Table1 和 Table2 中的内容以及预期的输出应该是什么? 您的查询返回了多少结果。如果多个,将 (col1, col2) 与 (col3, col4) 放在同一行的逻辑是什么? 我在上面简化了我的查询。我可以给你一个我的查询的例子。查询 1 在库存中返回 Col1:ProductName & Col2:NumberofProducts。查询 2 返回 Col3 :ProductName & Col4 : NumberofProductsSold @Whatsmyname 你能编辑一些样本数据然后得到想要的结果吗? 那么,假设两个表的行数相等,那么第一个表中的任何行都可以与第二个表中的任何其他行相关吗? 【参考方案1】:

这是一个在两个完全不相关的表之间进行联合的示例:Student 表和 Products 表。它生成一个 4 列的输出:

select
        FirstName as Column1,
        LastName as Column2,
        email as Column3,
        null as Column4
    from
        Student
union
select
        ProductName as Column1,
        QuantityPerUnit as Column2,
        null as Column3,
        UnitsInStock as Column4
    from
        Products

显然,您会根据自己的环境对其进行调整...

【讨论】:

@GojiraDeMonstah!谢谢!但是这种方法在结果输出中给了我一些额外的 NULL 插入。 好吧,我使用的示例有意使用一些空值来说明一张表如何导致数据中出现“漏洞”。但是,如果您不想看到空值,可以在示例中将它们替换为实际的列名,或者提供默认值,例如 ISNULL(MaxQty, 0.00)。 你应该使用UNION ALL,因为你知道不会有重复。【参考方案2】:

我认为你在追求这样的东西; (使用 row_number()CTE 并执行 FULL OUTER JOIN

Fiddle example

;with t1 as (
  select col1,col2, row_number() over (order by col1) rn
  from table1 
),
t2 as (
  select col3,col4, row_number() over (order by col3) rn
  from table2
)
select col1,col2,col3,col4
from t1 full outer join t2 on t1.rn = t2.rn

表格和数据:

create table table1 (col1 int, col2 int)
create table table2 (col3 int, col4 int)

insert into table1 values
(1,2),(3,4)

insert into table2 values
(10,11),(30,40),(50,60)

结果:

|   COL1 |   COL2 | COL3 | COL4 |
---------------------------------
|      1 |      2 |   10 |   11 |
|      3 |      4 |   30 |   40 |
| (null) | (null) |   50 |   60 |

【讨论】:

【参考方案3】:

怎么样,

select
        col1, 
        col2, 
        null col3, 
        null col4 
    from Table1
union all
select 
        null col1, 
        null col2,
        col4 col3, 
        col5 col4 
    from Table2;

【讨论】:

【参考方案4】:

问题在于,除非您的表是相关的,否则您无法确定如何加入它们,因此您必须任意加入它们,从而产生笛卡尔积:

select Table1.col1, Table1.col2, Table2.col3, Table2.col4
from Table1
cross join Table2

例如,如果您有以下数据:

col1  col2
a     1
b     2

col3  col4
y     98
z     99

你会得到以下结果:

col1  col2  col3  col4
a     1     y     98
a     1     z     99
b     2     y     98
b     2     z     99

这就是你要找的吗?如果没有,并且您有一些关联表格的方法,那么您需要将其包含在将两个表格连接在一起时,例如:

select Table1.col1, Table1.col2, Table2.col3, Table2.col4
from Table1
inner join Table2
on Table1.JoiningField = Table2.JoiningField

这将为您将所有内容整合到相关的数据中,从而为您提供结果。

【讨论】:

而且,由于您已编辑问题以向我们提供 ProductName,我们可以假设您将使用 ProductName 作为您的加入字段。【参考方案5】:

如果您的意思是两个 ProductName 字段具有相同的值,那么:

SELECT a.ProductName,a.NumberofProducts,b.ProductName,b.NumberofProductsSold FROM Table1 a, Table2 b WHERE a.ProductName=b.ProductName;

或者,如果您希望ProductName 列只显示一次,

SELECT a.ProductName,a.NumberofProducts,b.NumberofProductsSold FROM Table1 a, Table2 b WHERE a.ProductName=b.ProductName;

否则,如果 Table1 的任何行可以与 Table2 中的任何行相关联(尽管我真的很想知道为什么有人想要这样做),你可以给 this 看看。

【讨论】:

【参考方案6】:

老问题,但是其他人使用 JOIN 将不相关的查询组合到一个表中的行,这是我将不相关的查询组合到一行的解决方案,例如:

select 
  (select count(*) c from v$session where program = 'w3wp.exe') w3wp,
  (select count(*) c from v$session) total,
  sysdate
from dual;

给出以下单行输出:

W3WP   TOTAL  SYSDATE
-----  -----  -------------------
   14    290  2020/02/18 10:45:07

(这告诉我,我们的 Web 服务器当前使用了总共​​ 290 个会话中的 14 个 Oracle 会话;我在每隔几分钟运行一次的 sqlplus 脚本中记录这个没有标题的输出)

【讨论】:

【参考方案7】:

将每个查询加载到数据表中:

http://www.dotnetcurry.com/ShowArticle.aspx?ID=143

将两个数据表加载到数据集中:

http://msdn.microsoft.com/en-us/library/aeskbwf7%28v=vs.80%29.aspx

【讨论】:

【参考方案8】:

这是你可以做的。假设您的 ProductName 列具有共同值。

SELECT 
     Table1.ProductName, 
     Table1.NumberofProducts, 
     Table2.ProductName, 
     Table2.NumberofProductssold
FROM Table1
INNER JOIN Table2
ON Table1.ProductName= Table2.ProductName

【讨论】:

【参考方案9】:

试试这个:

SELECT ProductName,NumberofProducts ,NumberofProductssold
   FROM table1 
     JOIN table2
     ON table1.ProductName = table2.ProductName

【讨论】:

【参考方案10】:

试试这个:

获取 CURRENT_MONTH、LAST_MONTH 和 ALL_TIME 的记录并将它们合并到单个数组中

$analyticsData = $this->user->getMemberInfoCurrentMonth($userId);
$analyticsData1 = $this->user->getMemberInfoLastMonth($userId);
$analyticsData2 = $this->user->getMemberInfAllTime($userId);                        

    foreach ($analyticsData2 as $arr)                 
        foreach ($analyticsData1 as $arr1) 
            if ($arr->fullname == $arr1->fullname) 
                $arr->last_send_count = $arr1->last_send_count;
                break;
            else
                $arr->last_send_count = 0;
            
        
        foreach ($analyticsData as $arr2) 
            if ($arr->fullname == $arr2->fullname) 
                $arr->current_send_count = $arr2->current_send_count;
                break;
            else
                $arr->current_send_count = 0;
            
        
    
    echo "<pre>";
    print_r($analyticsData2);die;

【讨论】:

@Nolwennig 我相信这个问题与php无关。 我认为问题是针对与 sql 相关的查询,不是吗?

以上是关于如何将两个查询的结果合并到一个数据集中的主要内容,如果未能解决你的问题,请参考以下文章

DataSet——合二为一,合并两个数据集的数据内容

mysql合并结果集

如何在java中合并来自两个不同数据库的两个不同结果集

MySQL数据库联合查询与连接查询

BIRT将两个数据集中的字段报告/组合到一个动态文本框中

合并查询结果集UNION(去重), UNION ALL(不去重),INTERSECT(交集),MINUS(差集,第一个结果集减去第二个结果集,第一个结果集中不在第二个结果集中的记录行)