QuentinEllison Ответов: 4

Как выбрать первую запись таблицы, когда объединенное поле не содержит никаких данных


Я хочу выводить как принтеры, принтеры, null (выберите хотя бы первые два поля)
с этим самым существующим запросом и любым видом соединения
select a.acName,a.discription,s.quentity from #Accounts a
inner join #stock s on a.id = s.acId where addDate between '2001-11-01' and '2001-11-11' and a.id = 1


Что я уже пробовал:

вот такой сценарий

create table #Accounts(id int, acName nvarchar(50), discription nvarchar(128))
insert into #Accounts values (1, 'Printers', 'Printers')
insert into #Accounts values (2, 'HD', 'HD')
insert into #Accounts values (3, 'Mouse', 'Mouse')
insert into #Accounts values (4, 'Monitor', 'Monitor')
create table #stock(id int, acId int, quentity int,addDate datetime )
insert into #stock values (1,1,20,'2001-01-01')
insert into #stock values (1,2,10,'2001-10-01')
insert into #stock values (1,3,11,'2001-12-01')
insert into #stock values (1,4,5,'2001-11-01')

select a.acName,a.discription,s.quentity from #Accounts a
inner join #stock s on a.id = s.acId where addDate between '2001-11-01' and '2001-11-11' and a.id = 1

4 Ответов

Рейтинг:
1

NightWizzard

INNER JOIN ограничивает результат теми записями, которые имеют совпадения с обеих сторон. Чтобы всегда возвращать все записи из первой таблицы (и соответствующие записи или нулевые значения из второй таблицы), используйте LEFT JOIN.


QuentinEllison

не работает в этом случае из-за того, где
попробуйте данную таблицу n покажите мне решение если оно у вас есть
спасибо

Рейтинг:
1

NightWizzard

Спасибо CHill60 - я проследил, что addDate тоже из второго стола.
Чтобы вернуть "нуль" для количества, давайте, наконец, завершим его:

select a.acName,a.discription,IsNULL(CAST(s.quentity AS nvarchar(10)), 'null') 
from #Accounts a
left join #stock s on a.id = s.acId 
where ((s.addDate between '2001-11-01' and '2001-11-11')
or (s.addDate is null))
and (a.id = 1)


CHill60

Я нашел этот комментарий только случайно. Если вы хотите ответить, то используйте  У вас есть вопрос или комментарий?  ссылку на пост.

Также не считается хорошей практикой публиковать несколько решений одного и того же вопроса - другие участники, столкнувшиеся с этим, будут сбиты с толку относительно того, какое из ваших решений использовать. Вы можете использовать Улучшить решение ссылка для обновления ваших предыдущих усилий. Особенно в этом случае, поскольку решение 3 неверно, а решение 5, по сути, является моим репостом

Рейтинг:
0

NightWizzard

Использовать это:

select TOP 1  a.acName,a.discription,IsNULL(CAST(s.quentity AS nvarchar(10)), 'null') from #Accounts a
left join #stock s on a.id = s.acId where addDate between '2001-11-01' and '2001-11-11' and a.id = 1


CHill60

По-прежнему не возвращает никаких данных из-за того, где-смотрите мое решение о том, как преодолеть это

Рейтинг:
0

CHill60

Вам нужно использовать левое внешнее соединение и обслуживайте сценарии, в которых соединение ничего не возвращает. Подобный этому

select * from #Accounts A
left outer join #stock S on A.id=S.acId
where A.id = 1 
AND ((addDate between '2001-11-01' and '2001-11-11')
	OR addDate IS NULL)