Дополнение SQL Join? Нужна помощь T-SQL - PullRequest
5 голосов
/ 02 марта 2012

Я постараюсь, чтобы мой вопрос звучал как можно более запутанно.Я заранее прошу прощения за любые ошибки формулировки, так как я пытаюсь сформулировать свой вопрос как можно лучше:

Используя T-SQL, мне нужно написать оператор соединения, который получит мне все результаты, которые совпадают в таблицеA и таблица B

AND (!)

другой оператор соединения (или продолжение первого соединения), который возвращает все результаты из таблицы A, которые не имеют совпадения в таблице B,НО в этом втором наборе результатов мне нужно, чтобы один из столбцов был установлен в «N / A», чтобы идентифицировать записи, у которых не было совпадения.

Другими словами, мне нужно что-то, что вернуло бы всев таблице A, но также идентифицирует строки, которые не были сопоставлены в B. Эта информация затем используется в отчете.

Вот что у меня есть:

У меня есть перваячасть сделана:

LEFT OUTER JOIN dbo.chart B
ON B.UserName = A.user_name

Это дает мне совпадающие записи и только совпадающие записи

Я попытался добавить это второе соединение:

JOIN dbo.chart
ON NOT EXISTS (select * from B.UserName = A.user_name)

Надеюсь, что получит менянесоответствующие записи (я планировалЗатем используйте REPLACE в интересующем столбце, чтобы пометить этот столбец «N / A»), но с моим синтаксом что-то явно не так, поскольку он генерирует исключения.

Мой вопрос заключается в том, что мне нужно изменить напринеси мне результаты, которые тебе нужны.Я знаю, что мне нужно по крайней мере одно соединение, так как у меня есть другая часть запроса для работы.Я просто не знаю, нужно ли мне, чтобы одно объединение возвращало оба набора данных, которые мне действительно нужны, для второго - только для несоответствующих записей.

Надеюсь, это не слишком запутало.Любая помощь будет принята с благодарностью.

Спасибо!

Обновление: я просто хотел бы подчеркнуть, что причина, по которой я решил использовать второе объединение вместо получения всех результатов воднажды, потому что мне нужно правильно идентифицировать и пометить те строки, которые не были сопоставлены во всем, что я получаю.

Ответы [ 3 ]

3 голосов
/ 02 марта 2012

Я не уверен, куда вы идете со вторым соединением. LEFT JOIN, кажется, делает все, что вы хотите ...

DECLARE @tableA TABLE (a_id INT) INSERT INTO @tableA VALUES (1), (2), (3), (4)
DECLARE @tableB TABLE (b_id INT) INSERT INTO @tableB VALUES      (2), (3)

SELECT * FROM @tableA AS A LEFT JOIN @tableB AS B on A.a_id = b.b_id

 a_id | b_id
------+------
   1  | NULL
   2  |  2
   3  |  3
   4  | NULL

Разве вы не имеете в виду, что фактически объединяете 3 стола?

DECLARE @org    TABLE (o_io INT) INSERT INTO @org    VALUE       (2), (3), (4)
DECLARE @tableA TABLE (a_id INT) INSERT INTO @tableA VALUES (1), (2), (3), (4)
DECLARE @tableB TABLE (b_id INT) INSERT INTO @tableB VALUES      (2), (3)

SELECT
  *
FROM
  @org        AS O
INNER JOIN
  @tableA     AS A
    ON O.o_id = A.a_id
LEFT JOIN
  @tableB     AS B
    ON A.a_id = b.b_id

 o_id | a_id | b_id
------+------+------
   2  |   2  |  2
   3  |   3  |  3
   4  |   4  | NULL
1 голос
/ 02 марта 2012

Пример данных:

declare @TableA table
(
  TableAID int,
  TableAName varchar(10)
)

declare @TableB table
(
  TableBID int,
  TableBName varchar(10),
  TableAID int
)

insert into @TableA values
(1, 'A 1'),
(2, 'A 2'),
(3, 'A 3')

insert into @TableB values
(1, 'B 1', 1),
(2, 'B 2', 2)

Не указано вместо TableBName:

select A.TableAName,
       coalesce(B.TableBName, 'N/A') as TableBName
from @TableA as A
  left outer join @TableB as B
    on A.TableAID = B.TableAID

Результат:

TableAName TableBName
---------- ----------
A 1        B 1
A 2        B 2
A 3        N/A

Дополнительный столбец для N / A:

select A.TableAName,
       B.TableBName,
       case when B.TableBID is null 
         then 'N/A' 
         else '' 
       end as TableBPresent
from @TableA as A
  left outer join @TableB as B
    on A.TableAID = B.TableAID    

Результат:

TableAName TableBName TableBPresent
---------- ---------- -------------
A 1        B 1        
A 2        B 2        
A 3        NULL       N/A
0 голосов
/ 02 марта 2012

Попробуйте использовать объединение:

select A.id, b.id, b.desc from tablea A LEFT OUTER JOIN dbo.chart B
ON B.UserName = A.user_name

UNION 

select a.id, 0, 'N/A' from tablea where NOT EXISTS (select * from B.UserName = A.user_name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...