I can not perform a Select

3

I have a question about how I should mount SELECT for a given function.

The scenario is as follows:

I have 4 tables: Tab_Pessoa - Tab_Cliente - Tab_Autorizado - Tab_Cliente_Autorizado . So the Tab_Pessoa is related to Tab_Cliente and Tab_Autorizado - The Tab_Cliente_Autorizado is related to Tab_Cliente and Tab_Autorizado . Briefly, Tab_Pessoa has the name field.

I want to get the following information: The authorized name of a particular client.

Otherwise for clarity:

In Tab_Pessoa has the following records:

cod_pessoa  | Nome
1           | Luis
2           | Carlos
3           | Paulo

In Tab_Cliente has the following records:

cod_cliente | cod_pessoa 
1           | 1

In Tab_Autorizado has the following records:

cod_autorizado  | cod_pessoa 
1               | 2
2               | 3

In Tab_Cliente_Autorizado has the following records:

cod_cliente_autorizado | cod_cliente | cod_autorizado 
1                      | 1           | 1
2                      | 1           | 2

I want with cod_cliente = 1 I get the name of his authorized: Carlos and Paulo

I already mounted several SELECT's but I did not succeed, my mind would initially be this SELECT would be like this:

Select pes.nome from tab_Cliente_Autorizado cli_aut 
inner join tab_Cliente cli on cli.cod_cliente = cli_aut.cod_cliente
inner join tab_Pessoa pes on cli.cod_pessoa = pes.cod_pessoa
where cli_aut.cod_cliente = 1

But what I get is the client's name 2 times.

I'm grateful for any suggestions right now.

Update - Script of tables

- Person Table

go
create table tab_Pessoa(
cod_pessoa int identity(1,1) not null,
nome nvarchar(200) null,
constraint pk_pessoa Primary Key (cod_pessoa))
go

- Client Table

go
create table tab_Cliente(
cod_cliente int identity(1,1) not null,
cod_pessoa int not null,
constraint pk_cliente Primary Key (cod_cliente),
constraint fk_tab_Cliente_tab_Pessoa foreign key(cod_pessoa) references tab_Pessoa(cod_pessoa))

- Authorized Table

go
create table tab_Autorizado(
cod_autorizado int identity(1,1) not null,
cod_pessoa int not null,
constraint pk_autorizado Primary Key (cod_autorizado),
constraint fk_tab_Autorizado_tab_Pessoa foreign key(cod_pessoa) references tab_Pessoa(cod_pessoa))
go

- Client Table - Authorized

go
create table tab_Cliente_Autorizado(
cod_cliente_autorizado int identity(1,1) not null,
cod_cliente int not null,
cod_autorizado int not null,
constraint pk_cliente_autorizado Primary Key (cod_cliente_autorizado),
constraint fk_tab_Cliente_Autorizado_tab_Autorizado foreign key(cod_autorizado) references tab_Autorizado(cod_autorizado),
constraint fk_tab_Cliente_Autorizado_tab_Cliente foreign key(cod_cliente) references tab_Cliente(cod_cliente))
go
    
asked by anonymous 12.01.2015 / 14:15

1 answer

4

You do not need to wrap the Tab_Client table in SELECT because you will not get any data from it.

You need to obtain the authorization codes for a customer in the Authorized Tab_tab table and based on these codes, seek the authorized persons of this client in the Tab_Authorized table, and based on the codes of people found you need to get the names of people in Tab_Pessoa .

So the relationship could be represented like this: Authorized Tab_Customer -> Tab_Authorized - > Tab_Person . SELECT looks like this:

select 
    Tab_Pessoa.Nome
from
    Tab_Cliente_Autorizado
    JOIN Tab_Autorizado on Tab_Autorizado.cod_autorizado = Tab_Cliente_Autorizado.cod_autorizado
    JOIN Tab_Pessoa on Tab_Pessoa.cod_pessoa  = Tab_Autorizado.cod_pessoa
where
    Tab_Cliente_Autorizado.cod_cliente = 1

Note: If your tables only contain this data, you do not need the Tab_Authorized table. Instead, you could relate the authorized person directly to Authorized Tab . This table looks like this:

cod_cliente_autorizado | cod_cliente | cod_pessoa 
1                      | 1           | 2
2                      | 1           | 3

Another note: You do not need the "Tab_" prefix in table names.

    
12.01.2015 / 15:30