SQL Server匹配INNER JOIN结果

时间:2018-02-03 21:04:19

标签: sql sql-server

我有一个家庭作业问题说:
"列出具有相同价格的每对书籍的图书代码。 (例如,一个这样的一对将是书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;

我无法弄清楚如何将价格匹配在一起并使它们彼此相邻。有人可以帮我这个吗?

2 个答案:

答案 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

编辑:您也不需要不同的。