使用Oracle数据库进行SQL查询时遇到困难

时间:2012-01-26 16:40:29

标签: sql oracle

问题:

查找其关键字包含该书籍的书籍组的最后3个字符的书籍的标题。卡里姆"

我想这样做:

SELECT Title 
FROM Lib_Book 
WHERE BookKeywords LIKE '%(SELECT BookGroup FROM Lib_Book WHERE BookId=(SELECT BookId from Lib_Booking, Lib_Borrower WHERE Lib_Booking.BId=Lib_Borrower.BId AND Lib_Borrower.BName = 'Mr. Karim'))%'; 

从%到最后的部分返回给我一个答案,即编程'。所以我需要将BookKeyword表示为'%ing%'。我怎样才能做到这一点?

**表格很大所以我在这里写的那些......如果有人需要那些plz lemme知道...... thnx

1 个答案:

答案 0 :(得分:0)

你有基本的概念,虽然不可能在SELECT条款中处理LIKE语句(而且我可能会拍摄允许这样做的RDBMS开发者 - 它是为SQL注入打开巨大的漏洞。此外,您可能会遇到多个结果的问题,因为您的“查询”在Karim先生借了多本书的那一刻就会失败。

我可能首先尝试使用连接运行(哦,永远不要使用隐式连接语法):

SELECT d.title
FROM Lib_Borrower as a
JOIN Lib_Booking as b
ON b.bId = a.bId
JOIN Lib_Book as c
ON c.bookId = b.bookId
JOIN Lib_Book as d
ON d.bookKeywords LIKE '%' + SUBSTRING(c.bookGroup, LENGTH(c.bookGroup) - 3) + '%'
WHERE a.bName = 'Mr. Karim'

请注意以下警告:

  1. 这将为您提供所有与所有借书(来自所有'Karim先生)相似关键词的书籍的所有标题。加入Lib_Booking时,您可能需要包含某种限制性条件。
  2. bookKeywords似乎可能类似于多值列(需要示例数据)。如果是这样,您的表格结构需要进行修订。
  3. 使用SUBSTRING()RIGHT()将无法在加入bookGroup列时使用inidicies。鉴于您的要求,您可以做的事情并不多......
  4. 此表不是国际化安全的(因为bookGroup列是依赖于语言的解析文本)。您可以通过创建Book_Group表,Keywords表和交叉引用Book_Keywords表以及加入数字ID来获得更好的服务。您可能还需要语言键控Book_Group_DescriptionKeyword_Description表。这个占用更多空间,可能需要更多的处理时间(增加的连接数,尽管文本处理可能更少),但会增加灵活性和“安全性”。 / LI>