当前位置: 首页 > 面试题库 >

改善SQL查询以避免合并的另一种方法?

严峰
2023-03-14
问题内容

用户可以通过文本框中的邮政编码(例如:L14,L15,L16)或位置进行搜索。

如果用户键入“ Liverpool”,它将找到位于“
Liverpool”的所有商店。如果用户输入邮政编码(例如:L15),它将搜索所有在L15邮政编码区域中交货的商店。

请参阅下表:

mysql> select * from shops;
+----+----------+-----------+----------+
| id | name     | location  | postcode |
+----+----------+-----------+----------+
|  1 | Shop One | Liverpool | L10      |
|  2 | Shop Two | Liverpool | L16      |
+----+----------+-----------+----------+

--

mysql> select * from shops_delivery_area;
+------------------+---------+----------+---------------+
| delivery_area_id | shop_id | postcode | delivery_cost |
+------------------+---------+----------+---------------+
|                1 |       1 | L10      |          1.50 |
|                2 |       1 | L11      |          0.00 |
|                3 |       1 | L12      |          1.00 |
|                4 |       1 | L13      |          1.00 |
|                5 |       2 | L10      |          2.50 |
|                6 |       2 | L16      |          0.00 |
|                7 |       2 | L28      |          0.00 |
+------------------+---------+----------+---------------+

SQL查询:

SELECT U.* FROM 
   ((SELECT DISTINCT shops.*, DA.delivery_cost, DA.postcode AS AreaPostcode FROM shops
             JOIN shops_delivery_area as DA on (DA.shop_id = shops.id)
   WHERE DA.postcode = "Liverpool")
  UNION
   (SELECT DISTINCT shops.*, DA.delivery_cost, DA.postcode AS AreaPostcode FROM shops
             JOIN shops_delivery_area as DA on  
                              (DA.shop_id = shops.id AND
                              DA.postcode = shops.postcode)
   WHERE shops.location = "Liverpool")) as U

--

结果-按位置(利物浦):

+----+----------+-----------+----------+---------------+--------------+
| id | name     | location  | postcode | delivery_cost | AreaPostcode |
+----+----------+-----------+----------+---------------+--------------+
|  1 | Shop One | Liverpool | L10      |          1.50 | L10          |
|  2 | Shop Two | Liverpool | L16      |          0.00 | L16          |
+----+----------+-----------+----------+---------------+--------------+

结果-按邮政编码(L12):

+----+----------+-----------+----------+---------------+--------------+
| id | name     | location  | postcode | delivery_cost | AreaPostcode |
+----+----------+-----------+----------+---------------+--------------+
|  1 | Shop One | Liverpool | L10      |          1.00 | L12          |
+----+----------+-----------+----------+---------------+--------------+

它似乎工作正常…是否还有其他方法可以缩短SQL查询的时间以避免union或避免其他问题?


问题答案:

无论选择什么,请注意短代码并不总是最佳代码。在许多情况下,如果您的逻辑有足够的分歧,则合并结果确实是最佳的(有时甚至是最干净的编程方式)选项。

就是说,WHERE子句中的以下OR似乎涵盖了您的两种情况…

SELECT DISTINCT
  shops.*,
  DA.delivery_cost,
  DA.postcode AS AreaPostcode
FROM
  shops
INNER JOIN
  shops_delivery_area as DA
    ON (DA.shop_id = shops.id)
WHERE
  (DA.postcode = "Liverpool")
OR
  (DA.postcode = shops.postcode AND shops.location = "Liverpool")


 类似资料:
  • 问题内容: 今天,我遇到了一个有趣的SQL问题,尽管我想出了一个行之有效的解决方案,但我怀疑这是最佳还是最有效的答案。在这里,我请专家- 帮助我学习一些知识并改善查询条件!RDBMS是SQL Server 2008 R2,查询是SSRS报告的一部分,该报告将针对约100,000行运行。 本质上,我有一个ID列表,该ID可能具有多个与之关联的值,这些值是Yes,No或其他字符串。对于ID x,如果任

  • 问题内容: 有没有一种方法可以改善这种SQL查询性能: 问题是当我的表中有许多数据(如百万行)时,子句的执行非常慢。我必须执行此验证,因为我无法插入重复的数据。 我使用SQLServer 2005 谢谢 问题答案: 确保您正在搜索索引列,而没有操纵这些列中的数据(例如子字符串等)

  • 问题内容: 我正在使用SQL Server,并且我有两个表,我想合并为一个查询,用它来填充gridview。 表1 dbo.Work UID(PK,int) Tech_Ticket(int) RMA_Ticket(int) 区域(nchar10) 已完成(nchar10) FA(nchar10) 代理(nvarchar50) 跟踪(nvarchar50) Date_Added(date) Date

  • 问题内容: 避免嵌套查询有多重要。 我一直学会避免像瘟疫一样躲避它们。但是对我来说,它们是最自然的事情。在设计查询时,我首先写的是嵌套查询。然后,我将其转换为联接,有时需要花费很多时间才能正确。而且很少会带来很大的性能提升(有时确实会提高) 他们真的那么糟糕吗?有没有一种方法可以使用没有临时表和文件排序的嵌套查询 问题答案: 这确实取决于我遇到的情况,我可以通过使用子查询来改进一些查询。 我知道的

  • 国王、王后、鲁克、主教、骑士、卒: Piece:以上各部分的超类,共享功能如下所示 这里是我不喜欢的:我的Square类中有一个名为“board”的字段,这样我就可以引用给定的Square所属的board。我不喜欢这个设计,因为它会导致克隆的问题。 我是否应该将这个方法移到Board类中,这样我就可以访问Board对象,而不必从Square到Board? 我很感激你的想法bclayman

  • 如何通过@JmsListener仅更改一种方法的默认并发?我已将并发添加到@JmsListener(如下所示),但“JBoss管理控制台运行时JMS队列指标”中没有任何更改。我有JBoss 6.4,Spring JMS版本4.3.1。发布。 我的听众: 我的默认配置: