ahmed_sa Ответов: 2

Как создать динамический SQL на основе опциональных значений из временной таблицы ?


У меня есть #TempMaster temp таблица имеет 3 поля

с необязательными значениями в 3 полях SourceGeneralTypeID и StatusGeneralTypeID и DailyLogId
значение
может быть SourceGeneralTypeID имеет значения, а другие 2 поля не имеют значения
может быть StatusGeneralTypeID имеет значения, а другие 2 поля не имеют значения
может быть DailyLogId имеет значения, а другие 2 поля не имеют значения
так что моя проблема
Как написать заявление после соединения ? = ? - куда же ?

проблема как писать дальше ? = ? - куда же ???????????????
а что я пишу на чем
основываясь на приведенных выше деталях

подробные данные
create table #TempMaster(

SourceGeneralTypeID int,
StatusGeneralTypeID int,
DailyLogId  int
)
insert into #TempMaster

(SourceGeneralTypeID,StatusGeneralTypeID,DailyLogId)
values
(Null,10,20),
(2,Null,30),
(2,30,Null)


CREATE TABLE [MasterData](
	[MasterDataID] [int] IDENTITY(1,1) NOT NULL,
	[SourceGeneralTypeID] [int] NULL,
	[StatusGeneralTypeID] [int] NULL,
	[DailyLogId] [int] NULL,
 CONSTRAINT [PK_MasterData] PRIMARY KEY CLUSTERED 
(
	[MasterDataID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 

IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 

ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

insert into [MasterData] 
([SourceGeneralTypeID],[StatusGeneralTypeID],[DailyLogId])
values
(2,30,20),
(2,30,30),
(2,30,10)


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

select M.MasterDataID,M.TrackingNumber,M.StatusDate
 from #TempMaster tmp
INNER join [MasterData] M on ???=?????
where ??????

MadMyche

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

2 Ответов

Рейтинг:
1

Wendelius

Я бы не стал пытаться написать их в одном запросе. Соединение не очень динамично по своей природе.

Вместо этого вы можете разделить его на три части и использовать СОЮЗ (Transact-SQL) - SQL Server | Microsoft Docs[^] чтобы объединить результаты. Рассмотреть следующее

SELECT M.MasterDataID,M.TrackingNumber,M.StatusDate
FROM #TempMaster tmp
INNER JOIN [MasterData] M ON m.SourceGeneralTypeID = tmp.SourceGeneralTypeID
WHERE tmp.SourceGeneralTypeID IS NOT NULL
UNION ALL
SELECT M.MasterDataID,M.TrackingNumber,M.StatusDate
FROM #TempMaster tmp
INNER JOIN [MasterData] M ON m.StatusGeneralTypeID = tmp.StatusGeneralTypeID 
WHERE tmp.StatusGeneralTypeID IS NOT NULL
UNION ALL
SELECT M.MasterDataID,M.TrackingNumber,M.StatusDate
FROM #TempMaster tmp
INNER JOIN [MasterData] M ON m.DailyLogId = tmp.DailyLogId 
WHERE tmp.DailyLogId IS NOT NULL

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

Обратите внимание, что при построении этого приложения вы можете запускать каждый select отдельно . Это облегчает проверку правильности промежуточных результатов для каждого оператора SELECT. При выполнении только всего оператора может быть сложнее увидеть, какая часть дает недопустимые результаты.


Рейтинг:
0

Jörgen Andersson

Решение венделиуса хорошо, если вам нужно условие m.SourceGeneralTypeID = tmp.SourceGeneralTypeID OR м. StatusGeneralTypeID = ТМП.StatusGeneralTypeID OR м. DailyLogId = ТМП.DailyLogId, где любое из tmp-полей может быть null.

Но если вы хотите, чтобы AND-условие вы должны использовать вариант этого запроса:

SELECT  M.MasterDataID
       ,M.TrackingNumber
       ,M.StatusDate
FROM    MasterData M
JOIN    #TempMaster tmp
    ON  (m.SourceGeneralTypeID = tmp.SourceGeneralTypeID OR tmp.SourceGeneralTypeID IS NULL)
    AND (m.StatusGeneralTypeID = tmp.StatusGeneralTypeID OR tmp.StatusGeneralTypeID IS NULL)
    AND (m.DailyLogId          = tmp.DailyLogId          OR tmp.DailyLogId          IS NULL)