Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用内部联接检索记录_Sql_Sql Server - Fatal编程技术网

Sql 使用内部联接检索记录

Sql 使用内部联接检索记录,sql,sql-server,Sql,Sql Server,我的任务是获取所有在“2012-09-30”之前和“2013-09-30”之后收到订单的客户的名字、中间名和姓氏。我使用AdventureWorks2017作为示例数据库 表:Sales.SalesOrderHeader [SalesOrderID] ,[RevisionNumber] ,[OrderDate] ,[DueDate] ,[ShipDate] ,[Status] ,[OnlineOrderFlag]

我的任务是获取所有在“2012-09-30”之前和“2013-09-30”之后收到订单的客户的名字、中间名和姓氏。我使用AdventureWorks2017作为示例数据库

表:Sales.SalesOrderHeader

[SalesOrderID]
      ,[RevisionNumber]
      ,[OrderDate]
      ,[DueDate]
      ,[ShipDate]
      ,[Status]
      ,[OnlineOrderFlag]
      ,[SalesOrderNumber]
      ,[PurchaseOrderNumber]
      ,[AccountNumber]
      ,[CustomerID]
      ,[SalesPersonID]
      ,[TerritoryID]
      ,[BillToAddressID]
      ,[ShipToAddressID]
      ,[ShipMethodID]
      ,[CreditCardID]
      ,[CreditCardApprovalCode]
      ,[CurrencyRateID]
      ,[SubTotal]
      ,[TaxAmt]
      ,[Freight]
      ,[TotalDue]
      ,[Comment]
      ,[rowguid]
      ,[ModifiedDate]
表:个人。个人

[BusinessEntityID]
      ,[PersonType]
      ,[NameStyle]
      ,[Title]
      ,[FirstName]
      ,[MiddleName]
      ,[LastName]
      ,[Suffix]
      ,[EmailPromotion]
      ,[AdditionalContactInfo]
      ,[Demographics]
      ,[rowguid]
      ,[ModifiedDate]
表:销售额。客户

[CustomerID]
      ,[PersonID]
      ,[StoreID]
      ,[TerritoryID]
      ,[AccountNumber]
      ,[rowguid]
      ,[ModifiedDate]
我的问题


这个建议很好,但它会返回只有一个实例的记录。我现在遇到了一些小麻烦。例如,如果一个人在2012年之前或2013年之后下了2个订单,则仍将显示该订单。我要找的结果是,只有在给定日期之前和之后下了订单的人才会出现。试试这个,我不确定它是否有效。我没有要测试的数据集,但应该可以

SELECT DISTINCT person_table.FirstName, 
  person_table.MiddleName, 
  person_table.LastName
FROM Sales.SalesOrderHeader as sales_order_table
inner join Sales.Customer as sales_customer_table
  on (sales_customer_table.CustomerID = sales_order_table.CustomerID
inner join Person.Person as person_table
  on (person_table.BusinessEntityID = match_result.PersonID)
WHERE sales_order_table.OrderDate NOT BETWEEN '2012-09-30' AND '2013-06-30'

您可以简单地使用下面的命令。此外,您的日期筛选器不正确

SELECT DISTINCT p.FirstName, 
            p.MiddleName, 
            p.LastName
FROM Sales.SalesOrderHeader as s
INNER JOIN Sales.Customer as c                 
ON c.CustomerID = s.CustomerID
INNER JOIN Person.Person as p
ON p.BusinessEntityID = c.PersonID)
WHERE s.OrderDate >= '2012-09-30'     <----- add this
AND s.OrderDate <= '2013-06-30' )     ---- and this
我的任务是获取所有在“2012-09-30”之前和“2013-09-30”之后收到订单的客户的名字、中间名和姓氏

一种方法使用聚合:

SELECT p.FirstName, p.MiddleName, p.LastName
FROM person_table p JOIN
     Sales.Customer c
     ON p.BusinessEntityID = c.PersonID JOIN
     Sales.SalesOrderHeader so
     ON c.CustomerID = so.Cus tomerID
GROUP BY p.FirstName, p.MiddleName, p.LastName
HAVING MIN(so.OrderDate) < '2020-09-30' AND
       MAX(so.OrderDate) >'2013-06-30';

但是,这就是您在查询中使用的内容。我希望person表有一个类似PersonId的id。

示意图:从sales JOIN persons JOIN customers组中选择person,按日期为COUNTCASE的人分组,然后1 END>0,日期为COUNTCASE>2013-09-30,然后1 END>0考虑使用FROM子句,其中只有person.person和WHERE子句存在相关子查询。这将避免对DISTINCT的需要。奇怪的是,它不是for,而是BusinessEntityID
SELECT DISTINCT p.FirstName, 
            p.MiddleName, 
            p.LastName
FROM Sales.SalesOrderHeader as s
INNER JOIN Sales.Customer as c                 
ON c.CustomerID = s.CustomerID
INNER JOIN Person.Person as p
ON p.BusinessEntityID = c.PersonID)
WHERE s.OrderDate >= '2012-09-30'     <----- add this
AND s.OrderDate <= '2013-06-30' )     ---- and this
SELECT p.FirstName, p.MiddleName, p.LastName
FROM person_table p JOIN
     Sales.Customer c
     ON p.BusinessEntityID = c.PersonID JOIN
     Sales.SalesOrderHeader so
     ON c.CustomerID = so.Cus tomerID
GROUP BY p.FirstName, p.MiddleName, p.LastName
HAVING MIN(so.OrderDate) < '2020-09-30' AND
       MAX(so.OrderDate) >'2013-06-30';
ON p.BusinessEntityID = c.PersonID