none
Consulta Dinâmica RRS feed

  • 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

    quinta-feira, 14 de janeiro de 2010 20:06

Todas as Respostas

  • Query 3 retornou 12 para mim...


    Mas se vc fizer

    select count(distinct pesquisa_produtos.datapesquisa) quantidade from pesquisa_produtos

    Ai retorna 2
    datapesquisa
    2010-03-01
    2010-03-15

    Nao entendi como vc obteve 4 com a query 3

    Nao 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)
    quinta-feira, 14 de janeiro de 2010 20:17
  • 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
    sexta-feira, 15 de janeiro de 2010 00:19

  • 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
    sexta-feira, 15 de janeiro de 2010 11:41
  • 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!!!
    sexta-feira, 15 de janeiro de 2010 11:50


  • Marcelo,

    Exatamente!!!

    Eu quero fazer uma query com diversas possibilidades.

    Alguém ve alguma query possível para solucionar o problema na query2.


    Grato,


    Maurício
    sexta-feira, 15 de janeiro de 2010 17:38
  • maumauboy,

    este script é uma proc?

    att.
    Marcelo Fernandes
    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    sexta-feira, 15 de janeiro de 2010 18:19
  • Marcelo,


    Não é uma Proc, o solicitante quer uma consulta mesmo.


    Grato,

    Maurício
    sexta-feira, 15 de janeiro de 2010 18:41
  • 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!!!
    sexta-feira, 15 de janeiro de 2010 18:56
  • 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
    sábado, 16 de janeiro de 2010 00:09