2012-09-05 63 views
0

我试图获得一个子查询,除了会显示所有客户的订单名称为“衬衫衬衫”的订单的名字和姓氏之外。然后,我必须按降序排列由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; 

我做错了什么?

回答

2

第一个问题是你正在做两个表之间的交叉连接。第二个是IN中的子查询没有返回任何结果。 “衬衫”可能不是一个有效的价值,但是,考虑查询更像:

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; 

这不会解决这个问题(这是字符串‘衬衫’),但它是为了更好的语法前进

1

你肯定不希望你有什么权利了,因为你正在做一个交叉联接看看这个小提琴:。

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; 
0
-- 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 
;