2017-08-03 213 views
1

我不能使用联盟,因为它不是我想要的结果,而且我无法使用联合,因为我没有任何公共列。我已经尝试了许多不同的SQL查询结构,没有任何工作,因为我想。SQL结合了两个查询结果

我需要帮助来实现我认为是非常简单的SQL查询。我现在正在做的是

select a, b 
from (select top 4 a from element_type order by c) as Y, 
    (SELECT * FROM (VALUES (NULL), (1), (2), (3)) AS X(b)) as Z 

第一个是表的一部分,第二个是创建选择手形,给出的结果是这样的:

select a; --Give--> a,b,c,d (1 column) 
select b; --Give--> 1,2,3,4 (1 column) 

我需要基于两个查询首先给我(2列):

a,1 
b,2 
c,3 
d,4 

我该怎么做? UNION,JOIN或其他什么?或者,也许我不能。

所有我能得到现在是这样的:

a,1 
a,2 
a,3 
a,4 
b,1 
b,2 
... 
+1

您试图在不同的表中选择列吗?或者他们都是同一张桌子的一部分? –

+0

Thx为信息虐待尝试记住我已更新我的评论。正如我在这个问题中对糟糕的英语抱歉一样。 –

+0

使用您的表结构的模糊版本和您试图获得的所需输出来更新您的问题可能会更有用。 –

回答

-1

可以用户ROW_NUMBER()来实现这一点,

select a,row_number() over(order by a) as b from element_type; 

当你不采取第二部分从其他表,所以你不需要使用加入。但是,如果您在不同的表上执行此操作,则可以使用row_number()创建,以获取这两个表中的表和基础,您可以加入。

希望它会有所帮助。

+0

Thx为答案这正是我正在寻找我不知道的排名()函数,生病了看看它确实做了什么。 –

+0

欢迎,还有其他功能如rank(),dense_rank()...用于其他组合。 – Pirate

+0

我是-1这是因为您说“排名可以用来创建关键字..”但是关键字通常是唯一的,并且排名的输出不能保证对于给定的一组行是唯一的。除此之外,帖子是好的,但不要使用RANK()来创建密钥,您可以使用该密钥将此表数据加入到其他表中 –

0

如果您想纯粹连接两个表一起行显示的顺序,那么我希望你的数据库支持的分析(窗口)功能:

SELECT * FROM 
    (SELECT t.*, ROW_NUMBER() OVER(ORDER BY x) as rown FROM table1 t) t1 
    INNER JOIN 
    (SELECT t.*, ROW_NUMBER() OVER(ORDER BY x) as rown FROM table2 t) t2 
    ON t1.rown = t2.rown 

本质上,我们发明了一些东西,通过编号行来加入它们。如果其中一个表已经包含从1开始的递增整数,那么您不需要在该表上使用ROW_NUMBER()OVER(),因为它已经有合适的数据加入;实际上,即使它不支持分析,也存在难以进行行编号的方法,比如将表连接回自己使用id < idCOUNT(*) .. GROUP BY id来对这些行进行编号。我讨厌这样做,但是如果你的数据库不支持ROW_NUMBER,我会发布一个例子..:/

请记住,当然,RDBMS有一个与名称相关的数据是R .. ..相关。当数据不相关时,他们做得不太好,所以如果你希望将“粉笔”表加入到“奶酪”表中,即使两者完全不相关,你也会发现为什么这是艰难的工作! :)

+0

即使Pirate的答案已经适用于我以后想要做的虐待测试你的解决方案,我相信它会在稍后帮助我解决其他查询问题。 Thx寻求帮助。 –

+0

要小心RANK(),因为如果两行具有相同的值,则它不计数。即a,b,b,c将排列为1,2,2,4,并且它们将dense_rank设为1, 2,2,3。 ROW_NUMBER()将只对行1,2,3,4 –

+0

进行编号并且@ MaxenceBovier-Lapierre,这似乎是Oracle解决方案。如果您正在使用其他数据库,则可能没有这些功能。这就是为什么用你正在使用的数据库标记问题的重要性。 – SandPiper

0

尝试使用row_number。我创造了一些可以帮助你的东西。如下所示:

declare @tableChar table(letter varchar) 

insert into @tableChar(letter) 
select 'a'; 

insert into @tableChar(letter) 
select 'b'; 

insert into @tableChar(letter) 
select 'c'; 

insert into @tableChar(letter) 
select 'd'; 

select letter,ROW_NUMBER() over(order by letter) from @tableChar