Предложение Join для возврата результатов из обеих таблиц SQL Server - PullRequest
0 голосов
/ 04 мая 2018

Пожалуйста, смотрите: http://sqlfiddle.com/#!18/6552d/4

Таблица:

CREATE TABLE Figure(
MonthNumber varchar(10),
Code varchar(10),
Figure int
);

INSERT INTO Figure (MonthNumber, Code, Figure)
VALUES ('5', 'S', '25'),
('5','G', '30'),
('4','K', '30');

CREATE TABLE Person(
Code varchar(10)
);

INSERT INTO Person (Code)
VALUES ('S'),
('G' ),
('K' ),
('D' ),
('J');

Запрос:

SELECT F.[MonthNumber],
f.[Code],
f.[Figure]
FROM 
Figure F
RIGHT JOIN Person P
ON F.[Code] = P.[Code]

WHERE F.[MonthNumber] = '5'

Результат:

| MonthNumber | Code | Figure |
|-------------|------|--------|
|           5 |    S |     25 |
|           5 |    G |     30 |

Но я ищу такой результат:

| MonthNumber | Code | Figure |
|-------------|------|--------|
|           5 |    S |     25 |
|           5 |    G |     30 |
|           5 |    K |     30 |
|           5 |    D |      0 |
|           5 |    J |      0 |

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

Ответы [ 4 ]

0 голосов
/ 04 мая 2018
Try this I hope it helps

CREATE TABLE #Figure(
MonthNumber varchar(10),
Code varchar(10),
Figure int
);

INSERT INTO #Figure (MonthNumber, Code, Figure)
VALUES ('5', 'S', '25'),
('5','G', '30'),
('4','K', '30');

CREATE TABLE #Person(
Code varchar(10)
);

INSERT INTO #Person (Code)
VALUES ('S'),
('G' ),
('K' ),
('D' ),
('J');



SELECT F.[MonthNumber],
P.[Code],
f.[Figure]
FROM #Person  p
LEFT  JOIN #Figure F
ON P.[Code] = F.[Code]

WHERE F.[MonthNumber] = '5' 
or F.[MonthNumber] is null
0 голосов
/ 04 мая 2018

Я думаю, что это будет делать то, что должно, но не то, что вы спрашиваете именно из-за данных:

SELECT F.[MonthNumber], -- this wont select 5 for all rows, but you can hard code this to the 5
P.[Code],
ISNULL(f.[Figure], 0) AS Figure
FROM 
Person P 
LEFT OUTER JOIN Figure F ON P.[Code] = F.[Code]
    AND F.[MonthNumber] = '5'
0 голосов
/ 04 мая 2018

Вы можете использовать запрос, как показано ниже.

Обновление скрипки - http://sqlfiddle.com/#!18/6552d/24

SELECT 
MonthNumber= ISNULL(MonthNumber,'5'),
P.Code,
Figure= ISNULL(Figure,0)
FROM 
Figure F
RIGHT JOIN Person P
ON F.[Code] = P.[Code]
AND F.[MonthNumber] ='5'
0 голосов
/ 04 мая 2018

Внешнее соединение кажется правильным. Почему вы используете RIGHT JOIN вместо LEFT JOIN? За последним обычно проще следовать.

SELECT '5' as MonthNumber, p.[Code], COALESCE(f.Figure, 0) as Figure
FROM Person P LEFT JOIN
     Figure F
     ON F.[Code] = P.[Code] AND F.MonthNumber = '5';

Условие на второй таблице (в LEFT JOIN) должно идти в предложении ON.

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