我有一个家庭作业问题说:
"列出具有相同价格的每对书籍的图书代码。
(例如,一个这样的一对将是书0200和书7559,因为
两本书的价格都是8.00美元。)除了两个书籍代码外,还包括价格。
列出的第一本书代码应该是主要的排序键,第二本书
代码应该是次要排序键。"
我的代码如下:
USE Henry;
SELECT DISTINCT BOOK1.BOOK_CODE, BOOK1.PRICE
FROM BOOK
AS BOOK1
JOIN BOOK
AS BOOK2
ON (BOOK1.BOOK_CODE = BOOK2.BOOK_CODE)
AND (BOOK1.PRICE = BOOK2.PRICE)
WHERE BOOK1.PRICE = BOOK2.PRICE
ORDER BY BOOK1.PRICE, BOOK1.BOOK_CODE;
我无法弄清楚如何将价格匹配在一起并使它们彼此相邻。有人可以帮我这个吗?
答案 0 :(得分:1)
关于如何处理超过两本书中价格匹配的情况,问题并不是很清楚。我猜你不想显示多余的信息:
SELECT BOOK1.BOOK_CODE BOOK_CODE_1, BOOK2.BOOK_CODE BOOK_CODE_2, BOOK1.PRICE
FROM BOOK
AS BOOK1
JOIN BOOK
AS BOOK2
ON (BOOK1.BOOK_CODE < BOOK2.BOOK_CODE)
AND (BOOK1.PRICE = BOOK2.PRICE)
WHERE NOT EXISTS( --This will remove some redundant info
select *
from BOOK BOOK3
where BOOK3.BOOK_CODE<BOOK1.BOOK_CODE and BOOK3.PRICE=BOOK1.PRICE
)
ORDER BY BOOK1.BOOK_CODE, BOOK2.BOOK_CODE;
答案 1 :(得分:1)
指示声明:
“除了两个图书代码外,还包括价格。”
因此您必须更改您的选择以显示这些字段。
在您的代码中,您加入了BOOK1_Code = BOOK2_Code
,但由于您正在寻找价格相同的不同图书,因此这可能不正确。正如评论所示,您需要加入价格。
简单的INNER JOIN与加入条件不足的问题在于它会将BOOK1价格与BOOK2价格相匹配,并且仍然会相反 - 将BOOK2价格与BOOK1价格相匹配。根据价格,它也会将同一本书与自己相匹配。因此,同一对书将被列出两次,而这本书本身就会被列入一次。
为避免这种情况,您可以在INNER JOIN上强制执行BOOK1.Code与BOOK2.Code不同的条件。我会使用BOOK1.Code < BOOK2.CODE
来完成此操作,因为这样可以避免将相同的图书代码与自身匹配,并确保只将较少的图书代码与较大的图书代码进行比较。
USE Henry;
SELECT BOOK1.BOOK_CODE, BOOK2.BOOK_CODE, BOOK1.PRICE
FROM BOOK AS BOOK1
INNER JOIN BOOK AS BOOK2
ON BOOK1.PRICE = BOOK2.PRICE
AND BOOK1.BOOK_CODE < BOOK2.BOOK_CODE --2nd ON condition
--eliminates repeats
ORDER BY BOOK1.BOOK_CODE, BOOK2.BOOK_CODE
编辑:您也不需要不同的。