Usuário com melhor resposta
Unir duas Views por DateTime

Pergunta
-
Caros, que por falta de conhecimento não acho solução.
Tenho uma View A {Tanque, DataHoraInicio, DataHoraFim} em um banco relacional e outra View B {Tanque, DataHora} em um banco Temporal. Quando faço um Join entre as duas views como A.Tanque = B.Tanque ,o select me retorna valores duplicados, pois os campos de datahora não se coincidem (por lógica do processo eles não devem mesmo se coincidir em ambas views). Preciso então verificar quando horário de B.DataHora está entre os horários de A.DataHoraInicio e A.DataHoraFinal ao mesmo tempo em que A.Tanque = B.Tanque.
Fiz pelo Java, fazendo dois selects distintas em cada banco por vez, porém dessa forma eu perco algumas possibilidades que apenas o sql me oferece. Fiz alguns scripts também, porém não funcionou.
O resultado que preciso seria mais ou menos esse, nesse exemplo as datas estão coincidindo e não tem problema:
Se alguém puder me ajudar.
Respostas
-
Deleted
- Marcado como Resposta vagner.gomes terça-feira, 5 de setembro de 2017 11:32
Todas as Respostas
-
-
Exemplo:
View A
Tanque DataHoraInicio DataHoraFinal
10 2017-08-30 00:01:00 2017-08-30 01:05:00
13 2017-08-30 02:00:00 2017-08-30 03:48:00
View B
Tanque DataHora
10 2017-08-30 00:45:00
13 2017-08-30 03:01:00
15 2017-08-30 04:48:00
O Resultado Seria:
A.Tanque A.DataHoraInicio A.DataHoraFinal B.Tanque B.DataHora
10 2017-08-30 00:01:00 2017-08-30 01:05:00 10 2017-08-30 00:45:00
13 2017-08-30 02:00:00 2017-08-30 03:48:00 13 2017-08-30 03:01:00
-
Vagner,
Já pensou em utilizar o comando Distinct?
Pedro Antonio Galvao Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
Predro, utilizei sim. Porém, o que realmente não está dando certo é relacionar o B.DataHora que está entre A.DataHoraInicio e A.DataHoraFinal no qual o A.Tanque = B.Tanque.
SELECT substring(B.TagName, 11 ,2) as Tanque ,B.DateTime ,A.Tanque ,A.inicial ,A.final FROM A INNER JOIN (SELECT DateTime, TagName FROM B WHERE TagName like 'SelMist_TQ%.Word' ) B ON vm.numeroTanque = substring(TagName, 11 ,2) where inicio between '2017-08-30 00:00:00' and '2017-08-30 23:59:59' and DateTime >= inicial or DateTime <= final
Repare no resultado do código acima, ele pega o DateTime igual para todas as linhas, quando na verdade ele deveria pegar o DateTime que está entre a Data inicial e final.
- Editado vagner.gomes quarta-feira, 30 de agosto de 2017 13:22 Adição de imagem
-
Vagner boa tarde,
Já tentou da forma abaixo?
SELECT * FROM VW_A AS A
INNER JOIN VW_B AS B
ON A.Tanque = B.Tanque AND
B.DataHora BETWEEN A.DataHoraInicio AND A.DataHoraFinal
- Editado Ariel Gonçalves Fernandez quinta-feira, 31 de agosto de 2017 17:41
-
Exemplo:
View A
Tanque DataHoraInicio DataHoraFinal
10 2017-08-30 00:01:00 2017-08-30 01:05:00
13 2017-08-30 02:00:00 2017-08-30 03:48:00
View B
Tanque DataHora
10 2017-08-30 00:45:00
13 2017-08-30 03:01:00
15 2017-08-30 04:48:00
O Resultado Seria:
A.Tanque A.DataHoraInicio A.DataHoraFinal B.Tanque B.DataHora
10 2017-08-30 00:01:00 2017-08-30 01:05:00 10 2017-08-30 00:45:00
13 2017-08-30 02:00:00 2017-08-30 03:48:00 13 2017-08-30 03:01:00
Cara me desculpa se eu não estou conseguindo entender mas de uma olhada nisso
View A
Tanque DataHoraInicio DataHoraFinal
10 2017-08-30 00:01:00 2017-08-30 01:05:00
13 2017-08-30 02:00:00 2017-08-30 03:48:00
DECLARE @ViewA TABLE ( Tanque INT , DataHoraInicio DATETIME2 , DataHoraFinal DATETIME2 ); INSERT INTO @ViewA ( Tanque, DataHoraInicio, DataHoraFinal ) VALUES ( 10, '2017-08-30 00:01:00', '2017-08-30 01:05:00' ), ( 13, '2017-08-30 02:00:00', '2017-08-30 03:48:00' );
View B
Tanque DataHora
10 2017-08-30 00:45:00
13 2017-08-30 03:01:00
15 2017-08-30 04:48:00
DECLARE @ViewB TABLE ( Tanque INT, DataHora DATETIME ) INSERT INTO @ViewB ( Tanque , DataHora ) VALUES ( 10 , '2017-08-30 00:45:00'), ( 13 , '2017-08-30 03:01:00' ), ( 15 , '2017-08-30 04:48:00' )
O Resultado Seria:
A.Tanque A.DataHoraInicio A.DataHoraFinal B.Tanque B.DataHora
10 2017-08-30 00:01:00 2017-08-30 01:05:00 10 2017-08-30 00:45:00
13 2017-08-30 02:00:00 2017-08-30 03:48:00 13 2017-08-30 03:01:00
SELECT VA.Tanque , VA.DataHoraInicio , VA.DataHoraFinal, VB.Tanque, VB.DataHora FROM @ViewA AS VA JOIN @ViewB AS VB ON VB.Tanque = VA.Tanque
Wesley Neves - Brasilia-DF
wesley.si.neves@gmail.com
MTA-SQL Server
MTA- Web Development
Analista Desenvolvedor.NET
Pós-Graduando em Banco de Dados
"Se a resposta for útil ou ajudar ,não esqueça de marcar"
Wesley Neves
- Sugerido como Resposta Junior Galvão - MVPMVP segunda-feira, 4 de setembro de 2017 17:18
-
Deleted
- Sugerido como Resposta Junior Galvão - MVPMVP segunda-feira, 4 de setembro de 2017 17:19
-
-
-
-
-
Obrigado pela resposta, Wesley. Seu caso funciona porque tem apenas dois tanques na sua tabela, acredito eu. Aqui tenho várias informações dessas sendo geradas diáriamente, se for dessa forma os dados se repetem.
Executei seu código, veja o resultado:
- Editado vagner.gomes sexta-feira, 1 de setembro de 2017 16:43 Imagem
-
-
vc pode postar as seguintes consultas:
SELECT TO 10 * FROM ViewA ORDER BY NumeroTanque SELECT TO 10 * FROM ViewB ORDER BY NumeroTanque
Wesley Neves - Brasilia-DF
wesley.si.neves@gmail.com
MTA-SQL Server
MTA- Web Development
Analista Desenvolvedor.NET
Pós-Graduando em Banco de Dados
"Se a resposta for útil ou ajudar ,não esqueça de marcar"
Wesley Neves
-
-
-
-
-
Deleted
- Marcado como Resposta vagner.gomes terça-feira, 5 de setembro de 2017 11:32