【问题标题】:How to Join 4 tables in SQL如何在 SQL 中连接 4 个表
【发布时间】:2023-03-18 21:49:01
【问题描述】:

我想要做的是选择所有 4 个表并加入,但我不知道怎么做,因为没有一个表连接到所有其他表。

  create table Encomenda(
    idEncomenda int identity,
    idFornededor int not null,
    estado varchar not null,
    Constraint pk_Encomenda Primary Key (idEncomenda),
    );

    create table Produto_Encomenda(
    idProduto_Encomenda int identity,

    idProduto int not null,
    idEncomenda int not null,
    quantidade int not null,

    constraint pk_Produto_Encomenda Primary Key (idProduto_Encomenda),
    constraint fk_Produto foreign key (idProduto) references Produto (idProduto) ,
    constraint fk_idEncomenda foreign key (idEncomenda) references Encomenda (idEncomenda) ,
    );
    create table Fornecedor(
    idFornecedor int  identity,
    nomeFornecedor varchar(60) not null,
    moradaFornecedor varchar(60) not null,
    contactoFornecedor int not null,
    constraint pk_Fornecedor Primary Key (idFornecedor),
    );
    create table Produto(
    idProduto int identity,
    nomeProduto varchar(60) not null,
    quantidadeExistenteProduto int not null,
    precoUnidade float not null,
    Constraint pk_produto Primary Key (idProduto),
    );

我试图在其中 4 个之间建立连接,我想显示/选择的是:

Fornecedor.nomeFornecedor, idEncomenda, Produto.nomeProduto and Produto_encomenda.quantidade" joined toguether where 
Produto.idproduto = produto_Encomenda.idproduto
Fornecedor.idFornecedor = Encomenda.idFornecedor

我认为我无法更好地解释,但最后我想选择一个包含 Fornecedor.nomeFornecedor、idEncomenda、Produto.nomeProduto 和 Produto_encomenda.quantidade 的表,但是因为这 4 个表没有 1 个公用表,所以我丢失了如何加入:\ 我可能只是累得要死,但如果有人能帮助我,我会很感激因为我在这里迷路了

【问题讨论】:

  • 所有在一张桌子上
  • vb.net 在这里看起来不相关。
  • 请阅读How do I ask a good question。您的代码需要在代码示例区域内,并且您的问题可以通过少量研究轻松回答。
  • 你应该先加入一张桌子。
  • 将您的 create-table 示例代码放在代码块中,以便以可读的方式格式化。

标签: sql-server


【解决方案1】:

好的,现在我想我更好地理解了您需要以下字段的问题:Fornecedor.nomeFornecedor、idEncomenda、Produto.nomeProduto 和 Produto_encomenda.quantidade。

那么,让我们看看这是否可行:

SELECT f.nomeFornecedor, 
e.idEncomenda, 
p.nomeProduto,
pe.quantidade
FROM Fornecedor as f
INNER JOIN Encomenda AS e
ON f.idFornecedor = e.idFornededor 
INNER JOIN Produto_Encomenda as pe
ON e.idEncomenda = pe.idEncomenda
INNER JOIN Produto as p
ON p.idProduto = pe.idProduto

我认为这应该可行

【讨论】:

    【解决方案2】:

    您使用“JOIN”语句连接表。有四种类型:

    INNER - 仅在找到匹配项的地方加入。

    LEFT - 仅在右侧表中找到匹配项的地方加入,但加入整个左侧。

    RIGHT - 仅在左侧表中找到匹配项的地方加入,但加入整个右侧。

    FULL OUTER - 将两个表连接在一起,即使没有找到匹配项。

    一个基本的 JOIN 是这样的:

    INNER JOIN MyTable ON MyTable.ID = SomeTable.ID
    

    您应该阅读this

    希望对你有帮助!

    【讨论】:

    • 这实际上不是真的。你可以完美地做一个加入“FROM table1,table2 WHERE table1.id2 = table2.id2”。确实,使用“JOIN”以后会更清楚,但这不是进行 JOIN 的唯一方法
    • @asemprini87 应避免使用旧的连接方式。不仅根本看不清楚,尤其是在加入 2 个以上的表时,而且当您需要在多个条件下加入时变得非常困难,并且当您的 where 子句与加入。没有办法知道哪个是连接,哪个不是。
    • @asemprini87 虽然正确,但我不建议任何人在本世纪使用隐式连接,因为 20 多年来,显式连接已成为 ANSI-SQL 的一部分......
    • 我并不是说应该有人使用它。我只是说这不是加入的唯一方法。我第一次在遗留数据库上看到它时,我就像......“这到底是什么?”。很高兴知道如果您开始从事这项工作,您可能会特别发现什么。
    • 准确地说,逗号分隔的表列表是交叉连接。当添加 where 谓词以过滤掉不匹配的行时,它的行为类似于内部连接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 2020-05-17
    • 2019-05-16
    • 1970-01-01
    相关资源
    最近更新 更多