Posts
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) ...
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?
Régis é simples, veja um exemplo
select TOP 10 * from tbProdutos ORDER BY NEWID()
Espero ter ajudado
Fabio
Mas, nesse caso não vai listar sempre os 10 últimos? eu preciso de 10 aleatórios.....
Testou?
São os 10 aleatórios.
Fabio
Nao , mas estou tentando.
att
Fernanda
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
Passa a estrutura das duas tabelas para que eu possa te ajudar.
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
_____________________________________________________________________________
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
Sim, eu já fiz isso, mas não vem os dados que eu quero.
Estou tentando aqui, uma hora vai.
Valeu,
Regis
Utiliza o View e monta sua query por assistente. Você vai conseguir.
Fabio
Olá Regis tem mais alguma coisa que posso ajudar? Posso fechar o chamado?
Obrigado