SELECT 来自两个表的 UNION 和 JOIN,列为 varchar 而不是 int

SELECT UNION and JOIN from two tables with column varchar instead int

在数据库“prodbase”中我有三个 tables:

Table 产品

|id  | productname |   productprice  | productsupplierID (int11)  |
+----+-------------+-----------------+----------------------------+
|  1 |   Shirt     |     20          |         3                  |
|  2 |   Tshirt    |     25          |         5                  |  

Table 供应商

|supplierid (int11)  | suppliername (varchar) |
+--------------------+------------------------+
|  3                 |    CompanyA            |
|  5                 |    CompanyB            |

Table 员工

|id  |  staffname  |   staffposition   | 
+----+-------------+-------------------+
|  1 |    John     |   sales           |
|  2 |    Megan    |   accounting      |  

Table 产品使用来自 table 供应商的查找字段:supplierID。

我已经创建了一个数据库视图来合并 table 产品和员工。 使用以下查询。

SELECT 'prodbase'.'Products'.'productname' AS 'Product', 'prodbase'.'Products'.'productsupplierID' AS 'Supplier' FROM 'prodbase'.'Products'
UNION
SELECT 'prodbase'.'Staff'.'staffname' AS 'Staff', 'prodbase'.'Staff'.'staffposition' AS 'Position' FROM 'prodbase'.'Staff'
ORDER BY 'Supplier'
DESC LIMIT 5;

查询正常,但它在供应商列中显示编号 (ID)。

Product: Shirt  
Staff: John  
Position: sales    
Supplier: 3  

如何使用 JOIN 创建此 UNION 查询,以便它显示 Suppliername insted of supplierID? 所需输出示例:

Product: Shirt  
Staff: John  
Position: sales  
Supplier: CompanyA

您需要解决一些问题才能按您希望的方式返回数据。首先,我认为您在这里不需要 UNION 。 UNION 用于将多个查询合并为一个查询。我认为您只需要对数据使用 INNER JOIN 即可获得所需的输出。说到人际关系,你错过了一个重要的人际关系。员工、产品和供应商之间没有关系,因此除非你加入关系table,否则无法提供你想要的输出。我创建了一个名为 Sale 的可想象关系示例 table,它将员工与销售的产品联系起来。这不是一个完美的示例,但它可以让您实际使用数据。通过关系 table,您可以通过 INNER JOIN 获取员工销售的所有产品,在这个简单的示例中。

CREATE TABLE Products(id INT, productname VARCHAR(50), productprice int, productsupplierID int);
CREATE TABLE Supplier(supplierid INT, suppliername VARCHAR(50));
CREATE TABLE Staff(id INT, staffname VARCHAR(50),staffposition VARCHAR(50));

CREATE TABLE Sale(staffid INT, productId INT);

INSERT INTO Products VALUES(1,'Shirt',20,3),(2,'Tshirt',25,5);
INSERT INTO Supplier VALUES(3,'CompanyA'),(5,'CompanyB');
INSERT INTO Staff VALUES(1,'John','Sales'),(2,'Megan','Accounting');

INSERT INTO Sale VALUES(1,1);
SELECT
    Products.productname AS Product,
    Staff.staffname AS Staff,
    Staff.staffposition AS Position,    
    Products.productprice AS Price, 
    Supplier.suppliername AS Supplier 
FROM 
  Sale 
    INNER JOIN Products ON Products.id=Sale.productId         
    INNER JOIN Supplier ON Supplier.supplierid=Products.productsupplierID
    INNER JOIN Staff ON Staff.id = Sale.staffid
Product | Staff | Position | Price | Supplier
:------ | :---- | :------- | ----: | :-------
Shirt   | John  | Sales    |    20 | CompanyA

db<>fiddle here

已编辑 - 我根据评论删除了 Sale。我猜你可以交叉连接 staff,但是,如果 product/supplier 和 staff 之间没有关系,就没有合理的方法来放置数据。

SELECT
    Products.productname AS Product,
    Products.productprice AS Price, 
    Supplier.suppliername AS Supplier 
FROM  
    Products 
    INNER JOIN Supplier ON Supplier.supplierid=Products.productsupplierID