簡體   English   中英

在SQL上聯接3個表並檢查條件

[英]Joining 3 tables on sql and checking conditions

SelectClassicModels.Orders.CustomerNumber,
ClassicModels.CUSTOMERS.CUSTOMERNAME,     
ClassicModels.Employees.LASTNAME,
ClassicModels.Employees.firstNAME,
ClassicModels.employees.EmployeeNumber 
from ClassicModels.Orders

join 
ClassicModels.Customers
on ClassicModels.Orders.CustomerNumber = ClassicModels.Customers.CUSTOMERNUMBER

join

ClassicModels.EMPLOYEES
on ClassicModels.Employees.EMPLOYEENUMBER = ClassicModels.CUSTOMERS.SalesRepEmployeeNumber

聯接時這三個表工作正常,但是當我嘗試添加這些修飾符時,它們不起作用

group by ClassicModels.Orders.CustomerNumber
having count(ClassicModels.Orders.CustomerNumber) < 4

首先,歡迎使用StackOverflow!

我已使用我最喜歡的工具重新格式化了SQL,如果您有興趣,可以提供一個鏈接。 我還添加了別名以幫助使其更加“可讀”。 (別名是FROMJOIN子句中表名后面的小寫位。)

SELECT orders.CustomerNumber,
       customers.CustomerName,
       employees.LastName,
       employees.FirstName,
       employees.EmployeeNumber

FROM CLASSICMODELS.ORDERS orders

JOIN CLASSICMODELS.CUSTOMERS customers
  ON orders.CustomerNumber = customers.CustomerNumber

JOIN CLASSICMODELS.EMPLOYEES employees
  ON employees.EmployeeNumber = customers.SalesRepEmployeeNumber

現在我們已經完成了。 讓我們添加您的GROUP BYHAVING子句。

GROUP BY子句必須具有SELECT子句中使用的所有列。 (我不確定為什么。我還沒有查找它,但我只知道它是這樣工作的。:))

SELECT orders.CustomerNumber,
       customers.CustomerName,
       employees.LastName,
       employees.FirstName,
       employees.EmployeeNumber

FROM CLASSICMODELS.ORDERS orders

JOIN CLASSICMODELS.CUSTOMERS customers
  ON orders.CustomerNumber = customers.CustomerNumber

JOIN CLASSICMODELS.EMPLOYEES employees
  ON employees.EmployeeNumber = customers.SalesRepEmployeeNumber

GROUP BY orders.CustomerNumber,
         customers.CustomerName,
         employees.LastName,
         employees.FirstName,
         employees.EmployeeNumber

現在應該可以了。 然后,您只需在其中添加HAVING子句。

SELECT orders.CustomerNumber,
       customers.CustomerName,
       employees.LastName,
       employees.FirstName,
       employees.EmployeeNumber

FROM CLASSICMODELS.ORDERS orders

JOIN CLASSICMODELS.CUSTOMERS customers
  ON orders.CustomerNumber = customers.CustomerNumber

JOIN CLASSICMODELS.EMPLOYEES employees
  ON employees.EmployeeNumber = customers.SalesRepEmployeeNumber

GROUP BY orders.CustomerNumber,
         customers.CustomerName,
         employees.LastName,
         employees.FirstName,
         employees.EmployeeNumber

HAVING COUNT(orders.CustomerNumber) < 4

我也在查看您的查詢,通過使用以下查詢,您可能會更快(結果更高效):

WITH CUSTOMERSWITHLESSTHANFOURORDERS
AS
(
  SELECT CUSTOMERNUMBER
  FROM CLASSICMODELS.ORDERS
  GROUP BY CUSTOMERNUMBER
  HAVING COUNT(CUSTOMERNUMBER) < 4
)
SELECT O.CUSTOMERNUMBER,
       C.CUSTOMERNAME,
       E.LASTNAME,
       E.FIRSTNAME,
       E.EMPLOYEENUMBER
FROM CUSTOMERSWITHLESSTHANFOURORDERS O
JOIN CLASSICMODELS.CUSTOMERS C
  ON O.CUSTOMERNUMBER = C.CUSTOMERNUMBER
JOIN CLASSICMODELS.EMPLOYEES E
  ON E.EMPLOYEENUMBER = C.SALESREPEMPLOYEENUMBER;

它使用所謂的“公用表表達式”,並且基本上只是隔離查詢的一部分。 它可能會更高效,因為它將嘗試對更少的數據進行分組,因此可能會更快。 警惕,因為里面有很多“可能”,因為我不知道如何在MySQL數據庫中設置各種不同的東西。

祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM