【问题标题】:Abbreviating in SQL versus not abbreviatingSQL 中的缩写与不缩写
【发布时间】:2015-12-31 18:07:13
【问题描述】:

我是第一次参加 SQL 课程,在使用 leebooks.sql 文件编写查询时遇到问题。我遇到了一个解决方案,但我很好奇,因为我找到的解决方案包含所有表和列的缩写。当我尝试按照教授的喜好重写不带缩写的查询时,我收到一条错误消息,提示表不存在。我以为我正确地重写了它,带有缩写的查询工作正常。如果需要,我不知道在哪里上传 SQL 文件?以下是查询:

带缩写:

SELECT b.Title, bo.OrderDate,bo.OrderID
FROM BOOKS b
LEFT OUTER JOIN ORDER_ITEMS oi 
  ON b.BookID = oi.BookID
LEFT OUTER JOIN BOOK_ORDER bo 
  ON oi.OrderID = bo.OrderID
ORDER BY oi.BOOKID DESC;

没有缩写:

SELECT BOOKS.Title, BOOK_ORDER.OrderDate, BOOK_ORDER.OrderID 
FROM BOOKS 
LEFT OUTER JOIN ORDER_ITEMS.OrderID 
  ON BOOKS.BookID = ORDER_ITEMS.BookID 
LEFT OUTER JOIN BOOK_ORDER 
  ON ORDER_ITEMS.OrderID = BOOK_ORDER.OrderID 
ORDER BY ORDER_ITEMS.BookID DESC;

我不明白为什么第二个不起作用而第一个起作用,如果它们基本上是相同的。我错过了什么?

【问题讨论】:

  • 你有“LEFT OUTER JOIN ORDER_ITEMS.OrderID”你应该有“LEFT OUTER JOIN ORDER_ITEMS”

标签: mysql sql sql-server select


【解决方案1】:

“别名”,无论是 'table' AS tableAlias 还是列 (table.column AS columnAlias) 都是文本替换。

有一个表名 (ORDER_ITEMS) 替换为一个列名 (ORDER_ITEMS.OrderID)。即JOIN ORDER_ITEMS.OrderID 而不是:JOIN ORDER_ITEMS...

您所拥有的,使用“别名”,我添加了“AS”关键字以尝试使其清楚。

SELECT `b`.title, 
       `bo`.orderdate, 
       `bo`.orderid 
FROM   books AS `b`
       LEFT OUTER JOIN order_items AS `oi` 
                    ON `b`.bookid = `oi`.bookid 
       LEFT OUTER JOIN book_order  AS `bo` 
                    ON `oi`.orderid = `bo`.orderid 
ORDER  BY `oi`.bookid DESC; 

这是有效的 SQL。我使用了“AS”和反引号来突出显示“别名”。

表别名列表:

  • b => books
  • oi => order_items
  • bo => book_order

因此,将所有table aliases 替换为table names。这里我在表名周围使用反引号来表示替换。

SELECT `books`.title, 
       `book_order`.orderdate, 
       `book_order`.orderid 
FROM   `books` 
       LEFT OUTER JOIN `order_items` 
                    ON `books`.bookid = `order_items`.bookid 
       LEFT OUTER JOIN `book_order` 
                    ON `order_items`.orderid = `book_order`.orderid 
ORDER  BY `order_items`.bookid DESC; 

它是表名或列名的文本替换。

【讨论】:

  • 谢谢。我不确定缩写是否有某些规则,这是有道理的。谢谢!
  • 所以有了这个:SELECT BC.FirstName ||','|| BC.LastName AS "Customer Name" , BO.OrderID FROM BOOK_CUSTOMER BC NATURAL JOIN BOOK_ORDER BO WHERE BO.ShipDate is NOT NULL ORDER BY CustomerID ASC;如果没有缩写,它将是 SELECT BOOK_CUSTOMER.FirstName ||','|| BOOK_CUSTOMER.LastName AS "Customer Name" , BOOK_ORDER.OrderID FROM BOOK_CUSTOMER NATURAL JOIN BOOK_ORDER WHERE BOOK_ORDER.ShipDate is NOT NULL ORDER BY CustomerID ASC;
  • 另外值得一提的是——一旦你设置了别名就不能再使用“Table.Column”了,你需要使用“Alias.Column”。或者只要没有歧义,只要 [Column] 在这两种情况下都有效。
  • 我想通了,确实有效。不过感谢您的帮助。
【解决方案2】:

联接应该在表上执行,而不是在列上。您的子句LEFT OUTER JOIN ORDER_ITEMS.OrderID 应为LEFT OUTER JOIN ORDER_ITEMS。完整的查询,没有表别名:

SELECT BOOKS.Title, BOOK_ORDER.OrderDate, BOOK_ORDER.OrderID
FROM BOOKS 
LEFT OUTER JOIN ORDER_ITEMS ON BOOKS.BookID = ORDER_ITEMS.BookID 
LEFT OUTER JOIN BOOK_ORDER ON ORDER_ITEMS.OrderID = BOOK_ORDER.OrderID 
ORDER BY ORDER_ITEMS.BookID DESC;

【讨论】:

  • 哇,我不敢相信我没有看到。猜猜我的眼睛不习惯这么长时间开始这样的事情。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多