Inquiridor
Consulta Dinâmica

Pergunta
-
Olá,
- Gostaria de executar uma query qua fosse dinamica, que pesquisasse situações de "um para um" e "um para muitos",no exemplo abaixo eu tive dificuldade na segunda query abaixo (Query2) ,gostaria de saber se existe a possibilidade de trazer o resultado esperado que são quatro pesquisas sem desperdiçar o inner join com a Pesquisa_Produtos.
Pela query 3 os resultados são retornados de forma correta porém gostaria de elaborar uma consulta que inclua os outros dados (preços por exemplo) podendo assim retornar um resultado dinamico para o usuário.
- O objetivo é transformar a segunda query (query 2) em dinamica.
use temporario
/****** Object: Table [dbo].[Produtos] Script Date: 01/14/2010 17:34:19 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Produtos](
[codProduto] [int] NOT NULL,
[DescProduto] [nvarchar](50) COLLATE Latin1_General_CI_AS NULL,
CONSTRAINT [PK_Produtos] PRIMARY KEY CLUSTERED
(
[codProduto] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[Pesquisa] Script Date: 01/14/2010 17:33:21 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Pesquisa](
[Datapesquisa] [datetime] NOT NULL,
[usuario] [int] NOT NULL,
CONSTRAINT [PK_Pesquisa] PRIMARY KEY CLUSTERED
(
[Datapesquisa] ASC,
[usuario] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[pesquisa_produtos] Script Date: 01/14/2010 17:31:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[pesquisa_produtos](
[Datapesquisa] [datetime] NOT NULL,
[Usuario] [int] NOT NULL,
[Codproduto] [int] NOT NULL,
[Preco] [float] NOT NULL,
CONSTRAINT [PK_pesquisa_produtos] PRIMARY KEY CLUSTERED
(
[Datapesquisa] ASC,
[Usuario] ASC,
[Codproduto] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
USE [Temporario]
GO
ALTER TABLE [dbo].[pesquisa_produtos] WITH CHECK ADD CONSTRAINT [FK_pesquisa_produtos_Pesquisa] FOREIGN KEY([Datapesquisa], [Usuario])
REFERENCES [dbo].[Pesquisa] ([Datapesquisa], [usuario])
GO
ALTER TABLE [dbo].[pesquisa_produtos] WITH CHECK ADD CONSTRAINT [FK_pesquisa_produtos_Produtos1] FOREIGN KEY([Codproduto])
REFERENCES [dbo].[Produtos] ([codProduto])
if exists
(select * from produtos where codproduto is not null)
delete from produtos
insert into Produtos values (1,'Arroz')
insert into Produtos values (2,'Feijão')
insert into Produtos values (3,'Batata')
if exists
(select * from pesquisa where datapesquisa is not null)
delete from pesquisa
insert into pesquisa values ('03/01/2010',1)
insert into pesquisa values ('03/15/2010',1)
insert into pesquisa values ('03/01/2010',2)
insert into pesquisa values ('03/15/2010',2)
if exists
(select * from pesquisa_produtos where datapesquisa is not null)
delete from pesquisa_produtos
insert into pesquisa_produtos values ('03/01/2010',1,1,15.50)
insert into pesquisa_produtos values ('03/01/2010',1,2,17.50)
insert into pesquisa_produtos values ('03/01/2010',1,3,18.50)
insert into pesquisa_produtos values ('03/15/2010',1,1,16.10)
insert into pesquisa_produtos values ('03/15/2010',1,2,14.10)
insert into pesquisa_produtos values ('03/15/2010',1,3,19.10)
insert into pesquisa_produtos values ('03/01/2010',2,1,18.30)
insert into pesquisa_produtos values ('03/01/2010',2,2,16.25)
insert into pesquisa_produtos values ('03/01/2010',2,3,12.25)
insert into pesquisa_produtos values ('03/15/2010',2,1,17.12)
insert into pesquisa_produtos values ('03/15/2010',2,2,16.12)
insert into pesquisa_produtos values ('03/15/2010',2,3,14.12)
-- Query 1
-- Buscando todos os Dados
SELECT Pesquisa.Datapesquisa, Pesquisa.usuario, pesquisa_produtos.Codproduto, Produtos.DescProduto, pesquisa_produtos.Preco
FROM pesquisa_produtos INNER JOIN
Pesquisa ON pesquisa_produtos.Datapesquisa = Pesquisa.Datapesquisa AND pesquisa_produtos.Usuario = Pesquisa.usuario INNER JOIN
Produtos ON pesquisa_produtos.Codproduto = Produtos.codProduto
-- Buscando somente a quantidade de pesquisas
-- Query 2 – Gostaria que buscasse somente a quantidade de pesquisas
SELECT count(pesquisa_produtos.datapesquisa) quantidade
FROM pesquisa_produtos INNER JOIN
Pesquisa ON pesquisa_produtos.Datapesquisa = Pesquisa.Datapesquisa AND pesquisa_produtos.Usuario = Pesquisa.usuario INNER JOIN
Produtos ON pesquisa_produtos.Codproduto = Produtos.codProduto
-- 12 registros retornados -- Errado
-- Buscando somente a quantidade de pesquisas porém ignorando a tabela pesquisa_produtos.
-- Query 3
select count(pesquisa_produtos.datapesquisa) quantidade from pesquisa_produtos
-- Quatro registros retornados -- Certo
Grato,
Maurício
Todas as Respostas
-
Query 3 retornou 12 para mim...Mas se vc fizerselect count(distinct pesquisa_produtos.datapesquisa) quantidade from pesquisa_produtosAi retorna 2datapesquisa2010-03-012010-03-15Nao entendi como vc obteve 4 com a query 3Nao entendi, tambem, o que vc quer que a query 2 retorne....Att
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
SOGI INFORMATIQUE LTÉE (http://www.sogi.com) -
Mauricio,
Você poderia explicar o que cada query retorna?
Ao invês de realizar um Count, você poderia consultar a sys.sysindexes para o obter o número de linhas da sua table!!!!
Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA -
Olá junior,
Na query dois eu gostaria de saber como eu faço para fazer diversas consultas sem ter que ignorar os joins, ou seja sem ignorar a tabela pesquisa_produtos e a produtos.
Eu gostaria que a pessoa fizesse o tipo de consulta que ela quisesse com agrupameno ou sem agrupamento de forma que ela não precise em determinado momento ignorar o join com uma das tabelas da query 2
Grato
Maurício -
maumauboy,
acho que entendi sua dúvida....
vc quer fazer diversas consultas mas de maneiras diferentes, a principio vejo duas possibilidades.
montar query dinamica de acordo com o parametro escolhido pelo usuario, ou usar distinct na cosulta, pq no caso da query 2, acredito que o erro é um plano cartesiano.
att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!! -
-
-
-
Maurício,
Imagino não usa programacao em camadas, e que o script ficará direto na aplicacao e nao em uma proc.
sendo assim, vc pode montar o script dinamicamente de acordo com a opcao escolhida pelo usuário.
bom no ASP era +/- assim..
<%
STRsql = "SELECT campos FROM"
if paramentro = 1 then
strSQL = strSQL & " tabela_1"
else
strSQL = strSQL & " tabela_2"
end if
%>
ai executa-se a string STRsql
att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!! -
Maúricio,
Você gostaria de disponibilizar isso dentro da sua aplicação?
Onde por exemplo o usuário seleciona as tabelas, campos e condições e a query é processada?
Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA