none
Pode uma tabela depender de um dado dela mesma ? RRS feed

  • Pergunta

  • Num banco de dados de tarefas eu crio a tabela 'tarefa' e defino que esta tarefa possa ter 'dependencias' e que as dependencias  também possam ter dependências ... como eu poderia fazer para que a tabela dependencias necessite de dados dela própria ? Me parece impossível! Mas como resolverei isto, sem criar várias tabelas : dependencias1,2,3, ... 

    table tarefa                                table dependencias

    ------------------                         ------------------------

    id_tarefa                                    id_dependencia

    desc_tarefa                                *id_tarefa

    *id_dependencia                          desc_dependencia

    Grato pela atenção.

    sexta-feira, 26 de junho de 2015 17:32

Respostas

Todas as Respostas

  • AnaniasGuerra,

    Sim, é possível desde que as CONSTRAINS definidas tenham um relacionamento "pai-filho" para outra coluna da mesma tabela.

    Para maiores informações veja:

    https://technet.microsoft.com/pt-br/library/ms174846%28v=sql.105%29.aspx

    http://social.technet.microsoft.com/wiki/pt-br/contents/articles/21698.t-sql-classificando-dados-em-uma-tabela-hierarquica-com-relacao-pai-filho.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    • Marcado como Resposta ananiasguerra quarta-feira, 1 de julho de 2015 16:26
    sexta-feira, 26 de junho de 2015 17:45
    Moderador
  • Boa tarde,

    É possível sim, você pode fazer isso criando uma foreign key na tabela tarefa na qual a coluna id_dependencia é uma referência para a coluna código da própria tabela.

    Assim, no campo id_dependencia, só poderão ser inseridos os valores contidos no campo id_tabela.

    • Marcado como Resposta ananiasguerra quarta-feira, 1 de julho de 2015 16:26
    sexta-feira, 26 de junho de 2015 17:56
  • Deleted
    • Marcado como Resposta ananiasguerra quarta-feira, 1 de julho de 2015 16:26
    sexta-feira, 26 de junho de 2015 19:51
  • Agradeço a todos que responderam. Valeu mesmo! Agora entendí perfeitamente...

    Muito obrigado.

    quarta-feira, 1 de julho de 2015 16:27
  • Ana,

    Sim, isso é possível e aplicável, nos conceitos de banco de dados este tipo de cenário é conhecimento como Auto-Relacionamento, onde uma linha de registro dependa da própria chave primária da Tabela.

    Veja se exemplo pode te ajudar:

    -- Criando a Tabela Funcao --
    Create Table Funcao
    (CodigoFuncao Char(2) Primary Key Not Null,
      DescricaoFuncao Varchar(50) Not Null,
      ValorSalario Numeric(6,2) Not Null)
    Go
    
    -- Criando a Tabela Areas --
    Create Table Areas
    (CodigoArea Char(2) Primary Key Not Null,
     DescricaoArea Varchar(30) Not Null,
     RamalTelefone SmallInt Not Null)
    Go
    
    -- Criando a Tabela Funcionarios --
    Create Table Funcionarios 
    (NumeroRegistro Int Primary Key Not Null,
     NomeFuncionario Varchar(80) Not Null,
     DtAdmissao Date Default GetDate(),
     Sexo Char(1) Not Null Default 'M',
     CodigoFuncao Char(2) Not Null,
     CodigoArea Char(2) Not Null,
     CodigoDoGestor TinyInt Not Null)
    Go
    
    -- Criando os relacionamentos --
    Alter Table Funcionarios
     Add Constraint [FK_Funcionarios_Funcaos] Foreign Key (CodigoFuncao)
      References Funcao(CodigoFuncao)
    Go
    
    
    Create Table Funcionarios
     Add Constraint [FK_Funcionarios_Areas] Foreign Key (CodigoArea)
      References Areas(CodigoArea)
    Go
    
    -- Inserindo os Dados --
    Insert Into Funcao (CodigoFuncao, DescricaoFuncao, ValorSalario)
    Values ('F1', 'Aux.Vendas', 350.00), 
    	('F2', 'Vigia', 400.00),
    	('F3', 'Vendedor', 800.00),
    	('F4', 'Aux.Cobrança', 250.00), 
    	('F5', 'Gerente', 1000.00), 
    	('F6', 'Diretor', 2500.00),
    	('F7', 'Presidente', 2500.00)
    Go
    
    Insert Into Areas (CodigoArea,DescricaoArea,RamalTelefone)
    Values ('A1', 'Assist.Técnica', 2246),
    	('A2', 'Estoque', 2589),
    	('A3', 'Administração', 2772),
    	('A4', 'Segurança', 1810),
    	('A5', 'Vendas', 2599),
    	('A6', 'Cobrança', 2688)
    Go
    
    Insert Into Funcionarios (NumeroRegistro, NomeFuncionario, DtAdmissao, Sexo, CodigoArea, CodigoFuncao, CodigoDoGestor)
    Values (101, 'Juca Sampaio', '2003-08-10', 'M', 'A3', 'F5',22),
    	(104, 'Fernando Pereira', '2004-03-02', 'M', 'A4', 'F6',101),
    	(134, 'João Alves', '2002-05-03', 'M', 'A5', 'F1',123),
    	(121, 'Paulo Souza', '2001-12-10', 'M', 'A6', 'F5',115),
    	(195, 'Maria Silveira', '2002-01-05', 'F','A3', 'F5',139),
    	(139, 'Ana Laura', '2003-01-12', 'F', 'A4', 'F6',123),
    	(123, 'Silvio Rocha', '2003-06-29', 'M', 'A6', 'F3',148),
    	(148, 'Iolanda Aguiar', '2002-06-01', 'F', 'A5', 'F3',195),
    	(115, 'Roberto Fernandes', '2003-10-15', 'M', 'A2', 'F2',22),
    	(22, 'Sergio Noriega', '2000-02-10', 'M', 'A6', 'F6',22)
    Go
    
    Select  F.NumeroRegistro, 
    			F.NomeFuncionario, 
    			A.DescricaoArea 'Descricação da Área de Trabalho',
    			F1.DescricaoFuncao 'Descricação da Função',
    			Year(F.DtAdmissao) As Ano,
    			Month(F.DtAdmissao) As Mês,
    			Day(F.DtAdmissao) as Dia,
    			Convert(Varchar(3),F.CodigoDoGestor) + ' - ' + F2.NomeFuncionario As 'Gestor ou Responsável'
    From Funcionarios F Inner Join Areas A
    								  On F.CodigoArea = A.CodigoArea
    								 Inner Join Funcao F1
    								  On F.CodigoFuncao = F1.CodigoFuncao
    								 Inner Join Funcionarios F2
    								  On F2.NumeroRegistro = F.CodigoDoGestor
    Order By F.CodigoDoGestor Asc
    Go


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 8 de julho de 2015 18:22