是否有可能从表或视图UNION查询不具有任何公共的结果?我正在试图做的是从不同角度结合数据到一个结果。我

select a,b,null,c from VIEW1, VIEW2 where VIEW1.a = VIEW2.a
UNION
select null,null,z,null from VIEW3

我想的结果是A,B,Z,C。这是在那里我会用选择的呢?那是什么样子的?

select ? from (
select a,b,null,c from VIEW1, VIEW2 where VIEW1.a = VIEW2.a
UNION
select null,null,z,null from VIEW3)

我使用MS SQL Server和视图不具有主键。非常感谢。

有帮助吗?

解决方案

如果我明白你的问题,你可能得到的结果是这样的:

a1, b1, null, c1
a2, b2, null, c2
a3, b2, null, c3
null, null, z1, null
null, null, z2, null
null, null, z3, nul

1

..但你正在试图获得都是这样的结果:

a1, b1, z1, c1
a2, b2, z2, c2
a3, b2, z3, c3

我是否正确地理解这个问题?

如果这是正确的,你需要有一种方法来加入这些子查询在一起,让你可以告诉SQL的1一起去吧,和2一起去,等等。

其他提示

一个联合符连接的结果集,它不将它们结合起来。

所以,你会从你的第一个查询得到的是这样的:

  a      b    (null)  c
(null) (null)   z    (null)

如果您希望将它们组合,你将不得不加入他们,然后你需要有共同的东西,或者你必须将数据在程序结合起来。

你只有1列从每个?

如果是这样,那么如果上述图案总是将是这样的,这会工作:

SELECT SQ1.a, SQ1.b, SQ2.z, SQ1.c
FROM (
    SELECT 1 k, View1.a, b, NULL z, c
    FROM View1 INNER JOIN View2 ON View1.a = View2.a) SQ1
INNER JOIN (
    SELECT 1 k, NULL a, NULL b, z, NULL c
    FROM View3) SQ2 ON SQ1.k = SQ2.k

不过,如果你不知道View3.a是否具有价值或者View1.a有一个值,你想从第一个查询的一个,如果有一个值3,那么这将工作:

SELECT COALESCE(SQ1.a, SQ2.a) a, COALESCE(SQ1.b, SQ2.b) b,
    COALESCE(SQ1.z, SQ2.z) z, COALESCE(SQ1.c, SQ2.c) c
FROM (
    SELECT 1 k, View1.a, b, NULL z, c
    FROM View1 INNER JOIN View2 ON View1.a = View2.a) SQ1
INNER JOIN (
    SELECT 1 k, NULL a, NULL b, z, NULL c
    FROM View3) SQ2 ON SQ1.k = SQ2.k

不过,和有一个大的,但在这里。如果您在任的观点有超过一排,你将要与不属于一起的数据结束了。在这种情况下,你的必须的有共同之处。

下面是我尝试,对结果沿全码:

USE master
GO

DROP DATABASE TestDB
GO

CREATE DATABASE TestDB
GO

USE TestDB
GO

CREATE TABLE View1
(
    a INT,
    b INT,
    c INT
)
GO

CREATE TABLE View2
(
    a INT,
    z INT
)
GO

CREATE TABLE View3
(
    z INT
)
GO

INSERT INTO View1 (a, b, c) VALUES (10, 20, 30)
GO

INSERT INTO View2 (a, z) VALUES (10, 40)
GO

INSERT INTO View3 (z) VALUES (50)
GO


SELECT View1.a, b, NULL z, c
FROM View1 INNER JOIN View2 ON View1.a = View2.a
UNION
SELECT NULL a, NULL b, z, NULL c
FROM View3

SELECT SQ1.a, SQ1.b, SQ2.z, SQ1.c
FROM (
    SELECT 1 k, View1.a, b, NULL z, c
    FROM View1 INNER JOIN View2 ON View1.a = View2.a) SQ1
INNER JOIN (
    SELECT 1 k, NULL a, NULL b, z, NULL c
    FROM View3) SQ2 ON SQ1.k = SQ2.k

SELECT COALESCE(SQ1.a, SQ2.a) a, COALESCE(SQ1.b, SQ2.b) b,
    COALESCE(SQ1.z, SQ2.z) z, COALESCE(SQ1.c, SQ2.c) c
FROM (
    SELECT 1 k, View1.a, b, NULL z, c
    FROM View1 INNER JOIN View2 ON View1.a = View2.a) SQ1
INNER JOIN (
    SELECT 1 k, NULL a, NULL b, z, NULL c
    FROM View3) SQ2 ON SQ1.k = SQ2.k

结果:

a           b           z           c
----------- ----------- ----------- -----------
NULL        NULL        50          NULL
10          20          NULL        30

(2 row(s) affected)

a           b           z           c
----------- ----------- ----------- -----------
10          20          50          30

(1 row(s) affected)

a           b           z           c
----------- ----------- ----------- -----------
10          20          50          30

(1 row(s) affected)

如果添加一个单排VIEW3,如下所示:

INSERT INTO View3 (z) VALUES (51)

你将得到这些结果,发现了一倍行:

a           b           z           c
----------- ----------- ----------- -----------
NULL        NULL        50          NULL
NULL        NULL        51          NULL
10          20          NULL        30

(3 row(s) affected)

a           b           z           c
----------- ----------- ----------- -----------
10          20          50          30
10          20          51          30

(2 row(s) affected)

a           b           z           c
----------- ----------- ----------- -----------
10          20          50          30
10          20          51          30

(2 row(s) affected)

如果我明白这一点:你想“崩溃”的结果,并摆脱所有的NULL?如果是这样,永远不会导致VIEW3对应于从厂景/视图2的结果?如果是这样,是什么关系?如果没有,至少匹配做的结果数量?

点击多个记录,ROW_NUMBER()方法为我工作。选择的1K方法被返回笛卡儿积。结果,

SELECT SQ1.a, SQ1.b, SQ2.z, SQ1.c
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY a) k, View1.a, b, NULL z, c
    FROM View1 INNER JOIN View2 ON View1.a = View2.a) SQ1
INNER JOIN (
    SELECT ROW_NUMBER() OVER (ORDER BY b) k, NULL a, NULL b, z, NULL c
    FROM View3) SQ2 ON SQ1.k = SQ2.k

可以说,它是你正在寻找这样的事情? (只是一个野生猜测)

SELECT 
  VIEW1.a,
  VIEW1.b,
  (SELECT TOP 1 z FROM VIEW3) AS z,
  VIEW2.c
FROM
  VIEW1, VIEW2 
WHERE
  VIEW1.a = VIEW2.a

从任何SQL的结果选择,包括一个联盟,是一组静态列。 (无多态性。)

但你不必使用所有列的每一行中,可以使用在列不具有值的行空值。我还建议你包括“类型”行,以便客户能够听出给定行的类型(和有趣的列)。

示例:

 (Select
   'room' as view_type
 , rooms.room as room
 , NULL as color
 From rooms 
 )
UNION ALL
(Select
  'color' as view_type
 , NULL as room
 , colors.color as color
 From colors 
)

您真的想要一个交叉联接:

选择v1.a,v1.b,VIEW3.z,从v1.c (SELECT A,B,C,自VIEW1,视图2其中VIEW1.a = VIEW2.a)为V1 CROSS JOIN VIEW3

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top