2014-12-06 46 views
1

如果我有兩個表(客戶之一,與他們的信息,包括地址,姓名,電子郵件等),另一個訂單(以訂單號,發貨日期,客戶名稱誰下令項目) ,我怎麼能顯示少於3個訂單的客戶的電子郵件?SQL內部連接客戶與訂單

我知道我必須使用一個內連接和一些別名的,但我不知道如何着手。

謝謝!

是我到目前爲止有:

SELECT customer.email 
FROM customer as cust 
INNER JOIN (select customer_id, sum(line_qty) AS total 
      from orders as o ON cust.customer_id = o.customer_id 
      where total = (SELECT total < 3 
          FROM (select customer_id, sum(line_qty) AS total 
           from orders as o ON cust.customer_id = o.customer_id 
           ) as sub); 
+2

發表您的嘗試。事實上,使用模式和一些示例數據創建sqlfiddle! – 2014-12-06 02:58:15

+0

剛剛發佈了它@MitchWheat – Student3794 2014-12-06 03:41:00

+1

你正在使用哪些DBMS? Postgres的?甲骨文? – 2014-12-06 06:27:20

回答

1

我已經創建了SQL的完整的例子。只需運行查詢即可創建數據庫,表格和「獲取客戶訂單」的存儲過程。

「客戶」和表格「訂單」中的樣本數據的關係是「1客戶到很多訂單」,所以客戶在表格中有一個外鍵訂單,以識別哪個客戶有訂單。所以。

首先創建數據庫,運行此查詢。

Create DataBase [Customer_OrdersDB] 

刷新服務器瀏覽器,你會發現一個數據庫的名稱已經創建。 然後運行查詢以創建存儲過程和表。

USE [Customer_OrdersDB] 
GO 
CREATE PROCEDURE [dbo].[GetCustomer_Mail] 
AS 
BEGIN 
select Email as Customer_Mail 
from Customers as cust inner join Orders as ord 
on cust.CustomerId = ord.OrderCustomerId 
group by(Email) 
having COUNT(ord.OrderCustomerId) < 3 
END 

GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[Customers](
    [CustomerId] [int] IDENTITY(1,1) NOT NULL, 
    [CustomerName] [nvarchar](50) NULL, 
    [Address] [nvarchar](50) NULL, 
    [Email] [nvarchar](50) NULL, 
CONSTRAINT [PK_Customers] PRIMARY KEY CLUSTERED 
(
    [CustomerId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 
/****** Object: Table [dbo].[Orders] Script Date: 12/6/2014 5:19:11 AM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[Orders](
    [OrderId] [int] IDENTITY(1,1) NOT NULL, 
    [OrderDate] [datetime] NULL, 
    [OrderNumber] [nvarchar](50) NULL, 
    [OrderCustomerId] [int] NULL, 
CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED 
(
    [OrderId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 
SET IDENTITY_INSERT [dbo].[Customers] ON 

INSERT [dbo].[Customers] ([CustomerId], [CustomerName], [Address], [Email]) VALUES (1, N'Ahmed', N'Cairo', N'[email protected]') 
INSERT [dbo].[Customers] ([CustomerId], [CustomerName], [Address], [Email]) VALUES (2, N'Ali', N'Paris', N'[email protected]') 
INSERT [dbo].[Customers] ([CustomerId], [CustomerName], [Address], [Email]) VALUES (3, N'Samir', N'UK', N'[email protected]') 
SET IDENTITY_INSERT [dbo].[Customers] OFF 
SET IDENTITY_INSERT [dbo].[Orders] ON 

INSERT [dbo].[Orders] ([OrderId], [OrderDate], [OrderNumber], [OrderCustomerId]) VALUES (1, CAST(0x0000A2A600000000 AS DateTime), N'1234', 1) 
INSERT [dbo].[Orders] ([OrderId], [OrderDate], [OrderNumber], [OrderCustomerId]) VALUES (2, CAST(0x0000A2C700000000 AS DateTime), N'555', 1) 
INSERT [dbo].[Orders] ([OrderId], [OrderDate], [OrderNumber], [OrderCustomerId]) VALUES (3, CAST(0x00009CF100000000 AS DateTime), N'56d66', 1) 
INSERT [dbo].[Orders] ([OrderId], [OrderDate], [OrderNumber], [OrderCustomerId]) VALUES (4, CAST(0x00009E9B00000000 AS DateTime), N'555we', 2) 
INSERT [dbo].[Orders] ([OrderId], [OrderDate], [OrderNumber], [OrderCustomerId]) VALUES (5, CAST(0x0000A2A600000000 AS DateTime), N'1234', 1) 
INSERT [dbo].[Orders] ([OrderId], [OrderDate], [OrderNumber], [OrderCustomerId]) VALUES (6, CAST(0x0000A2C700000000 AS DateTime), N'555', 1) 
SET IDENTITY_INSERT [dbo].[Orders] OFF 
ALTER TABLE [dbo].[Orders] WITH CHECK ADD CONSTRAINT [FK_Orders_Customers] FOREIGN KEY([OrderCustomerId]) 
REFERENCES [dbo].[Customers] ([CustomerId]) 
GO 
ALTER TABLE [dbo].[Orders] CHECK CONSTRAINT [FK_Orders_Customers] 
GO 

然後訪問你想要得到的客戶電子郵件,如果他/她做訂單少於3個數量級的存儲過程。

  1. 轉到SQL Server服務器/對象瀏覽器。
  2. 選擇名稱[Customer_OrdersDB]的數據庫。
  3. 選擇「可編程性」。
  4. 選擇「StoredProcedures」。
  5. 右鍵單擊您的存儲過程「GetCustomer_Mail」,然後選擇執行。
+0

你現在怎麼使用SQL Server? – 2014-12-06 06:47:35

1

試試這個:

SELECT c.email 
FROM customer AS c 
LEFT OUTER JOIN orders AS o ON c.customer_id = o.customer_id 
GROUP BY c.email 
HAVING SUM(o.line_qty) < 3