Проблема объединения результатов двух разных запросов в один - PullRequest
1 голос
/ 15 февраля 2010

У меня есть две таблицы (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

Но если я сейчас удалю из таблицы B:

delete tableB

Теперь, когда я запускаю тот же запрос, что и раньше:

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

Я вижу это:

A    B

Но я ожидал увидеть значение из таблицы A

как это:


Ожидаемый результат:

A    B
1    

Почему это происходит и как я могу увидеть значение из TableA, хотя selectB возвращает 0 строк?

Я использую MS SQL Server 2005.

Ответы [ 4 ]

3 голосов
/ 15 февраля 2010

Используйте 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 )

Однако, если у вас будет больше строк в a или b, будет возвращено декартово произведение:

1  1
1  2
2  1
2  2
1 голос
/ 15 февраля 2010

Это на самом деле даст вам то, что вы ищете, но если у вас есть только одна строка на таблицу:

select 
(select A from tableA) as A 
, (select B from TableB) as B
0 голосов
/ 15 февраля 2010

попробуй:

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

ВЫВОД:

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

(1 row(s) affected)

если вы DELETE @TableB, то вывод:

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

(1 row(s) affected)
0 голосов
/ 15 февраля 2010

попробуйте это:

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

должен восстановить все существующие данные.

вы можете отфильтровать его, окружив его другим выбором

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...