Fórum Select na StoredProcedure #3364

06/03/2009

0

Preciso fazer um select para pegar alguns dados de outra tabela, consigo fazer de uma tabela, mas não consigo fazer para duas tabelas.....   O que eu preciso fazer é uma storedprocedure que pegue o IdProPlan, pesquise na tabela ProPlan qual o price,
Régis Mello

Régis Mello

Responder

Posts

09/03/2009

Fabio Mans

Regis você tem que utilizar INNER JOIN.   Veja se o conceito abaixo pode te ajudar.     Join é a ferramenta básica de trabalho nos bancos de dados relacionais. É através dos diferentes tipos de join que conseguimos recuperar dados de uma ou mais tabelas com o auxílio dos relacionamentos existentes. Para os exemplos a seguir serão consideradas duas tabelas : produto e venda. A tabela venda - como o prórpio nome sugere - irá registrar vendas de itens cadastrados na tabela produto, mas pela característica do negócio também serão permitidas vendas de produtos sem cadastro. O script abaixo irá criar e popular as tabelas venda e produto: /* criação da tabela produto */
create table produto
(
cod_produto int primary key,
descr_produto varchar (20)
) /* criação da tabela venda.*/ create table venda
(
id_venda int identity primary key,
cod_produto int ,
qtde int,
vlr_unit dec(9,2)
) /* populando a tabela produto */ insert into produto values (101001,'Livro-1')
insert into produto values (101002,'Livro-2')
insert into produto values (101003,'Livro-3')
insert into produto values (101004,'Livro-4')
insert into produto values (101005,'Livro-5') /* populando a tabela venda */ insert into venda (cod_produto,qtde,vlr_unit)  values (101001,2,14.00)
insert into venda (cod_produto,qtde,vlr_unit)  values
(101002,1,20.50)
insert into venda (cod_produto,qtde,vlr_unit)  values
(101003,4,12.00)
insert into venda (cod_produto,qtde,vlr_unit)  values (101030,6,
8.00)
insert into venda (cod_produto,qtde,vlr_unit)  values
(101031,1,44.00)

O relacionamento entre as tabelas produto e venda pode ser visualizado na figura-1. Figura-1: Relacionamento entre as tabelas produto e venda   cadastrados (tab.produto) vendidos (tab.venda) vendidos sem cadastro cadastrados e não vendidos vermelho + verde verde + azul azul vermelho 10101 10101 10102 10102 10103 10103 10104 10104 10105 10105   10130 10130 10131 10131 Observemos o seguinte: A área em vermelho representa os produtos que foram cadastrados mas não foram vendidos.Para resgatar esses produtos devemos utilizar um left join , ligando um filtro para listar SOMENTE as linhas EXISTENTES na tabela produto SEM CORRESPONDÊNCIA na tabela venda ; A área em azul representa produtos que foram vendidos e não possuem cadastro. Para resgatar esses produtos deveremos utilizar um right join ligando um filtro para listar SOMENTE as linhas EXISTENTES na tabela venda SEM CORRESPONDÊNCIA na tabela produto ; A área em verde representa a intersecção dos dois conjuntos, isto é, produtos que foram vendidos e possuem cadastro. Para selecionar as linhas que possuem equivalência nas duas tabelas utilizamos o inner join ; Para representar a união de todos os produtos com todas as vendas, independentemente de relacionamento (áreas em vermelho+verde+azul) utilizamos um full outer join.   com o auxílio da figura-1 listada a seguir e, à partir do script para criação das tabelas produto (cod_ produto , descr_ produto ) e venda (cod_ produto , qtde, vlr_unit) forcecido na matéria anterior (explorando os tipos de JOIN  – parte i)  ...

Responder

Gostei + 0

10/03/2009

Régis Mello

Nossa gostei muito da sua explicação, foi bem prática e simples de entender. Valew....     Mas, nesse mesmo select preciso fazer um select randomico para pegar produtos aleatórios.   Tipo pesquisar aleatoriamente 10 produtos para mostrar na tela principal antes de mostrar.      Como faço isso?
Responder

Gostei + 0

10/03/2009

Fabio Mans

Régis é simples, veja um exemplo   select TOP 10 * from tbProdutos ORDER BY NEWID()   Espero ter ajudado   Fabio  
Responder

Gostei + 0

10/03/2009

Régis Mello

Mas, nesse caso não vai listar sempre os 10  últimos? eu preciso de 10 aleatórios..... 
Responder

Gostei + 0

10/03/2009

Fabio Mans

Testou? São os 10 aleatórios.   Fabio
Responder

Gostei + 0

11/03/2009

Fabio Mans

Conseguiu?
Responder

Gostei + 0

11/03/2009

Régis Mello

Nao , mas estou tentando.   att Fernanda
Responder

Gostei + 0

11/03/2009

Régis Mello

  Os aleatórios deveram certo, mas a busca em duas tabelas não está retornando nada além de erros, não gera ao sp, vou colar aqui o que eu preciso fazer para você poder entender e assim me ajudar     set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go   ALTER PROCEDURE [dbo].[SP_SELECT_USER] ( @Identifier nvarchar(50), @UserLicense varchar(25) ) AS BEGIN IF NOT EXISTS(SELECT 1 FROM cc_UserIdentifier WHERE IDENTIFIER = @Identifier) BEGIN SELECT 2 AS TIPO, 'REGISTRO NÃO ENCONTRADO NA TABELA DE PARCEIROS COMERCIAIS.' AS MENSAGEM END   SELECT UserNum, UserLicense, UserIdD, UserName, Email, EmailAdditional, DocFormat, DocNumber, Language, AddressMail, Country, City, State, ZipCode, Sex, Birth, AuthEmail, ReadTerm, NameFantasy, FunctionCompany, WebSite, AccountBankName, AccountBankOffice, AccountBankNum, AccountBankType FROM CC_USER WHERE (Identifier = @Identifier) AND (UserLicense = @UserLicense) END   Até aqui funciona, mas preciso pegar na tabela RelationShip também um dado, ou seja, nessa mesma pesquisa preciso fazer um select na RetationShip e capturar o IdPlan do Identifier = @Identifier e UserLicense = UserLicense. Isso precisa retornar da mesma pesquisa, deu para entender? Valew Regis
Responder

Gostei + 0

11/03/2009

Fabio Mans

Passa a estrutura das duas tabelas para que eu possa te ajudar.    
Responder

Gostei + 0

11/03/2009

Régis Mello

Preciso pegar o IdPlan e o IdI da tabela cc_Relationship e todos os dados do cc_User na mesma consulta. Ambas as tabelas  tem o Identifier e o IdNum     USE [Ecommerce] GO /****** Object: Table [dbo].[cc_Relationship] Script Date: 03/11/2009 13:21:35 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[cc_Relationship]( [IdRelationship] [bigint] IDENTITY(1,1) NOT NULL, [IdNum] [bigint] NOT NULL, [IdD] [bigint] NOT NULL, [IdI] [bigint] NOT NULL, [Identifier] [nvarchar](50) COLLATE Latin1_General_CI_AS NOT NULL, [IdPlan] [int] NOT NULL, CONSTRAINT [PK_cc_Relationship] PRIMARY KEY CLUSTERED ( [IdRelationship] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY], UNIQUE NONCLUSTERED ( [IdNum] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] _____________________________________________________ USE [Ecommerce] GO /****** Object: Table [dbo].[cc_User] Script Date: 03/11/2009 13:24:20 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[cc_User]( [UserNum] [bigint] IDENTITY(1,1) NOT NULL, [Identifier] [nvarchar](50) COLLATE Latin1_General_CI_AS NOT NULL, [UserIdD] [bigint] NULL, [UserLicense] [nvarchar](50) COLLATE Latin1_General_CI_AS NULL, [UserName] [nvarchar](100) COLLATE Latin1_General_CI_AS NOT NULL, [NameCompany] [nvarchar](100) COLLATE Latin1_General_CI_AS NULL, [Email] [nvarchar](50) COLLATE Latin1_General_CI_AS NOT NULL, [EmailAdditional] [varchar](50) COLLATE Latin1_General_CI_AS NULL, [Password] [nvarchar](128) COLLATE Latin1_General_CI_AS NOT NULL, [DocFormat] [nchar](1) COLLATE Latin1_General_CI_AS NOT NULL, [DocNumber] [nvarchar](25) COLLATE Latin1_General_CI_AS NOT NULL, [Language] [nchar](5) COLLATE Latin1_General_CI_AS NULL, [AddressMail] [nvarchar](255) COLLATE Latin1_General_CI_AS NULL, [Country] [nvarchar](50) COLLATE Latin1_General_CI_AS NULL, [City] [nvarchar](50) COLLATE Latin1_General_CI_AS NULL, [State] [nchar](10) COLLATE Latin1_General_CI_AS NULL, [ZipCode] [nchar](10) COLLATE Latin1_General_CI_AS NULL, [Sex] [nchar](1) COLLATE Latin1_General_CI_AS NULL, [Birth] [nchar](10) COLLATE Latin1_General_CI_AS NULL, [AuthEmail] [nchar](1) COLLATE Latin1_General_CI_AS NOT NULL, [ReadTerm] [nchar](1) COLLATE Latin1_General_CI_AS NOT NULL, [NameFantasy] [nvarchar](50) COLLATE Latin1_General_CI_AS NULL, [FunctionCompany] [nvarchar](50) COLLATE Latin1_General_CI_AS NULL, [WebSite] [nchar](50) COLLATE Latin1_General_CI_AS NULL, [AccountBankName] [nvarchar](25) COLLATE Latin1_General_CI_AS NULL, [AccountBankOffice] [nchar](10) COLLATE Latin1_General_CI_AS NULL, [AccountBankNum] [nchar](10) COLLATE Latin1_General_CI_AS NULL, [AccountBankType] [nchar](1) COLLATE Latin1_General_CI_AS NULL, [CreateDate] [datetime] NULL, [IP] [nvarchar](20) COLLATE Latin1_General_CI_AS NULL ) ON [PRIMARY] GO SET ANSI_PADDING OFF _____________________________________________________________________________
Responder

Gostei + 0

12/03/2009

Fabio Mans

Pela estrutura que você me passou você tem duas tabelas relacionadas, para o ccUser você pode ter muitos cc_Relationship, como elas estão relacionadas basta utilizar INNER JOIN, como te expliquei no primeiro Post.   Veja o exemplo.     SELECT     cc_User.UserNum, cc_User.Identifier, cc_Relationship.Identifier AS AS IdentTabCC_RelationShip
FROM         cc_Relationship INNER JOIN
                      cc_User ON cc_Relationship.IdNum = cc_User.UserNum     Acrescente os outros campos que você necessita.           Espero ter ajudado.   ============================================================ Até aqui funciona, mas preciso pegar na tabela RelationShip também um dado, ou seja, nessa mesma pesquisa preciso fazer um select na RetationShip e capturar o IdPlan do Identifier = @Identifier e UserLicense = UserLicense. Isso precisa retornar da mesma pesquisa, deu para entender? Valew Regis
Responder

Gostei + 0

17/03/2009

Fabio Mans

Mais alguma dúvida?
Responder

Gostei + 0

17/03/2009

Régis Mello

Sim, eu já fiz isso, mas não vem os dados que eu quero.   Estou tentando aqui, uma hora vai.   Valeu,   Regis
Responder

Gostei + 0

17/03/2009

Fabio Mans

Utiliza o View e monta sua query por assistente. Você vai conseguir.   Fabio
Responder

Gostei + 0

20/03/2009

Fabio Mans

Olá Regis tem mais alguma coisa que posso ajudar? Posso fechar o chamado?   Obrigado
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar