如何将两个查询的结果合并到一个数据集中
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 相关的查询,不是吗?以上是关于如何将两个查询的结果合并到一个数据集中的主要内容,如果未能解决你的问题,请参考以下文章
合并查询结果集UNION(去重), UNION ALL(不去重),INTERSECT(交集),MINUS(差集,第一个结果集减去第二个结果集,第一个结果集中不在第二个结果集中的记录行)