2010-02-15 56 views
1

我有两个表(TableA和TableB)。将两个不同查询的结果合并为一个的问题

create table TableA 
(A int null) 

create table TableB 
(B int null) 

insert into TableA 
(A) values (1) 

insert into TableB 
(B) values (2) 

我不能加入他们在一起,但我仍想从他们显示的结果为一行。

现在我可以选择这样的:

select 
(select A from tableA) as A 
, B from TableB 

结果:

A B 
1 2 

但如果我现在从tableB的删除:

delete tableB 

现在,当我运行相同的查询像以前一样:

select 
(select A from tableA) as A 
, B from TableB 

我看到这一点:

A B 

但我期待从TABLEA看到价值

这样的:


预期结果:

A B 
1  

为什么会发生这种情况,我怎样才能看到TableA的值,但selectB返回0行?

我使用MS SQL Server 2005的

+0

做了这些答案给你你需要什么? – 2010-02-18 21:36:49

回答

0

周围更多的过滤它试试这个:

DECLARE @TableA table (A int null) 
DECLARE @TableB table (B int null) 

insert into @TableA (A) values (1) 
insert into @TableB (B) values (2) 

--this assumes that you don't have a Numbers table, and generates one on the fly with up to 500 rows, you can increase or decrease as necessary, or just join in your Numbers table instead 
;WITH Digits AS 
( 
    SELECT 0 AS nbr 
    UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 
    UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 
    UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 
) 
, AllNumbers AS 
(
    SELECT u3.nbr * 100 + u2.nbr * 10 + u1.nbr + 1 AS Number 
     FROM Digits u1, Digits u2, Digits u3 
     WHERE u3.nbr * 100 + u2.nbr * 10 + u1.nbr + 1 <= 500 
) 
, AllRowsA AS 
(
    SELECT 
     A, ROW_NUMBER() OVER (ORDER BY A) AS RowNumber 
    FROM @TableA 
) 
, AllRowsB AS 
(
    SELECT 
     B, ROW_NUMBER() OVER (ORDER BY B) AS RowNumber 
    FROM @TableB 
) 
SELECT 
    a.A,b.B 
    FROM AllNumbers    n 
     LEFT OUTER JOIN AllRowsA a on n.Number=a.RowNumber 
     LEFT OUTER JOIN AllRowsB b on n.Number=b.RowNumber 
    WHERE a.A IS NOT NULL OR b.B IS NOT NULL 

OUTPUT:

A   B 
----------- ----------- 
1   2 

(1 row(s) affected) 

如果DELETE @TableB,输出为:

A   B 
----------- ----------- 
1   NULL 

(1 row(s) affected) 
3

使用LEFT JOIN(尽管它更像是一个交叉的加入你的情况)。

如果你的数据库支持的话:

SELECT a.a, b.b 
FROM a 
CROSS JOIN b 

如果没有,这样做:

SELECT a.a, b.b 
FROM a 
LEFT JOIN b ON (1=1) 

但是,一旦你有更多的排在ab,这将返回笛卡尔乘积:

1 1 
1 2 
2 1 
2 2 
+0

我无法将它们一起加入 - 没有可以加入的列。 – Imageree 2010-02-15 11:12:02

+0

在SQL Server中我无法使用解决方案1 ​​ - 交叉联接返回null null。 但是我可以使用解决方案2,如果我确信我只会看到1行。 – Imageree 2010-02-15 11:19:49

0

试试这个:

select a, (select b from b) from a 
union 
select b, (select a from a) from b 

应该找回你所有的现有数据。

您可以通过另一个选择

1

这实际上会给你你要找的东西,但是如果你只有一排每桌:

select 
(select A from tableA) as A 
, (select B from TableB) as B