子查询 - 加入

Posted

技术标签:

【中文标题】子查询 - 加入【英文标题】:Subquery - Join 【发布时间】:2012-09-05 16:24:04 【问题描述】:

我正在尝试获取一个子查询以及一个连接语句,该语句将显示所有客户的名字和姓氏,这些客户的订单包含名为“Dress Shirt”的项目。然后我必须报告按 LastName 升序排序的结果,然后按 FirstName 降序排序。这就是我所拥有的,但它一直给我“未选择行”:

SELECT FirstName, LastName
FROM HW2G_CUSTOMER, HW2G_ORDER_ITEM
WHERE Item IN 
    (SELECT Item
     FROM HW2G_ORDER_ITEM
     WHERE Item = ‘DressShirt’)
ORDER BY LastName ASC, FirstName DESC;

我做错了什么?

【问题讨论】:

【参考方案1】:

第一个问题是您正在两个表之间进行交叉连接。第二个是IN中的子查询没有返回任何结果。 'Dress Shirt" 可能不是一个有效值。但是,考虑一个更像这样的查询:

SELECT distinct FirstName, LastName
FROM HW2G_CUSTOMER c join
     HW2G_ORDER_ITEM i
     on c.customerID = i.customerID
WHERE i.Item = ‘Dress Shirt’
ORDER BY LastName ASC, FirstName DESC;

这不能解决问题(即字符串“Dress Shirt”),但它是更好的前进语法。

【讨论】:

【参考方案2】:

你肯定不想要你现在拥有的东西,因为你正在做一个交叉连接。看看这个小提琴:

http://www.sqlfiddle.com/#!3/30abb/5

SELECT FirstName, LastName
FROM HW2G_CUSTOMER WHERE CustomerId IN
    (SELECT CustomerId
     FROM HW2G_ORDER_ITEM
     WHERE Item = 'Dress Shirt')
ORDER BY LastName ASC, FirstName DESC;

【讨论】:

【参考方案3】:
-- maybe a bit cleaner than @aqinas 's solution?
WITH wanted AS (
  SELECT DISTINCT CustomerId
     FROM HW2G_ORDER_ITEM
     WHERE Item = 'Dress Shirt'
   )
SELECT FirstName, LastName
FROM HW2G_CUSTOMER cus
JOIN wanted wa ON wa.CustomerId = cus.CustomerId
ORDER BY LastName ASC, FirstName DESC
 ;

【讨论】:

以上是关于子查询 - 加入的主要内容,如果未能解决你的问题,请参考以下文章

没有子查询但加入的重组查询?

加入而不是相关子查询

加入与子查询

使用join语句加入子查询

将子查询(不在)重写为加入

mysql加入子查询