AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 129862
Accepted
MSIS
MSIS
Asked: 2016-02-20 13:56:19 +0800 CST2016-02-20 13:56:19 +0800 CST 2016-02-20 13:56:19 +0800 CST

Motivação de consulta para junções cruzadas

  • 772

Digamos que temos duas tabelas 'Fornecedores' e 'Faturas'. Entendo que um motivo para fazer uma junção à esquerda de 'Fornecedores' com 'Faturas' ao longo da coluna VendorID é obter informações sobre fornecedores sem faturas. Uma junção à direita é basicamente uma junção à esquerda com tabelas trocadas (essa é a principal motivação, certo)?

Mas não consigo ver uma motivação geral de cross joins nesse sentido, ou seja, se eu receber tabelas Vendors, Invoices unidas ao longo VendorID como acima, que informação é que Vendors Cross Join me permite obter que não posso obter através de uma junção esquerda , ou então?

Obrigado.

sql-server join
  • 2 2 respostas
  • 133 Views

2 respostas

  • Voted
  1. Duffy
    2016-02-20T14:07:55+08:002016-02-20T14:07:55+08:00

    Um CROSS JOIN fornece o produto cartesiano de todas as linhas nas duas tabelas e, em seguida, aplica qualquer filtragem da cláusula WHERE. Raramente serve a um propósito para seus relacionamentos de mesa mais comuns, mas há algumas ocasiões em que é útil.

    Por exemplo, pode ser necessário atribuir relacionamentos entre uma tabela estática de Propriedades e alguns Itens armazenados em outra tabela. A maneira mais fácil de adicionar um novo item e relacionar suas propriedades necessárias seria inserir os resultados de um CROSS JOIN entre as duas tabelas em uma tabela de vinculação entre elas. Valores específicos para essas propriedades poderiam ser adicionados posteriormente por meio de outras interfaces, mas eles já teriam a estrutura atribuída sem a necessidade de codificar a interface.

    • 4
  2. Best Answer
    Aaron Bertrand
    2016-02-20T14:18:48+08:002016-02-20T14:18:48+08:00

    CROSS JOINs são geralmente usados ​​para explodir um conjunto de dados para produzir um grande número de linhas. Por exemplo, eu uso CROSS JOINs para criar minhas tabelas Numbers .

    Existem outros propósitos práticos, no entanto. Digamos que você tenha uma tabela de permissões:

    CREATE TABLE dbo.BasePermissions
    (
      PermissionID INT PRIMARY KEY,
      Description VARCHAR(32)
    );
    INSERT dbo.BasePermissions VALUES(1, 'Do stuff'),(2, 'Do other stuff');
    

    Agora, você provavelmente tem um mapeamento de tabela UserID -> PermissionID, mas isso não é realmente necessário para usuários administrativos. Portanto, nesse caso, você pode ter a seguinte consulta (digamos que o aplicativo precise de permissões granulares para cada usuário ou que você tenha exceções para usuários específicos que pode aplicar posteriormente, etc.):

    SELECT u.UserID, p.PermissionID, p.Description
    FROM dbo.Users AS u
    CROSS JOIN dbo.BasePermissions AS p
    WHERE u.IsAdmin = 1;
    

    Isso produzirá um conjunto de linhas (número de usuários administradores * número de permissões), com todas as permissões listadas para cada usuário administrador. Isso evita que você tenha que armazenar cada conjunto único e também significa que não precisa atualizar todos os usuários administradores ao adicionar ou remover uma permissão.

    (Este não é um exemplo super prático, porque o aplicativo pode ser escrito de forma a reconhecer um usuário administrador, mas digamos que o aplicativo não possa ser alterado.)

    Como um aparte, resista à tentação de usar um RIGHT JOIN. Atenha-se à ESQUERDA, é uma maneira muito mais simples de pensar sobre relacionamentos conceitualmente IMHO. Toda vez que vejo um RIGHT JOIN, eu o reescrevo para o LEFT antes de fazer qualquer outra coisa.

    • 3

relate perguntas

  • Qual é a diferença entre um INNER JOIN e um OUTER JOIN?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como é a saída de uma instrução JOIN?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve