【问题标题】:replace inner join with select from, perhaps?用 select from 替换内部连接,也许?
【发布时间】:2010-06-30 18:19:24
【问题描述】:

我正在尝试理解和修改输入字段用于执行智能搜索的 SQL 查询。

原代码在这里:

((`clients` INNER JOIN `addresstorecord` ON `clients`.`uuid` = 
   `addresstorecord`.`recordid` AND `addresstorecord`.
   `tabledefid`='tbld:6d290174-8b73-e199-fe6c-bcf3d4b61083' AND
    addresstorecord.primary='1') INNER JOIN 
  `addresses` ON  `addresstorecord`.`addressid` = `addresses`.`uuid`)

我实际上不需要内部连接,因为我的所有信息都已经在一个表中了。

在这种情况下,理论上我可以用我的表名替换内部连接查询吗?还是我必须实际执行 select from 语句?

【问题讨论】:

  • 试一试会不会比在这里问更快?
  • 嗯,是的,但它不起作用,我想知道这是否是原因,或者理论上它是否应该起作用。如果它应该工作,那么可能是其他问题。
  • 您发布的 sn-p 指的是 3 个表:addressesaddresstorecordclients。正如比尔卡尔文所说,连接的目的可能是限制最终结果集。如果这些表中有所需的数据,它们也可能是必需的。但是,您似乎没有发布完整的查询,这使得很难准确理解它应该做什么。你也没有说为什么要改变它,或者你想要得到什么结果。

标签: sql mysql


【解决方案1】:

查询可以使用连接来限制结果集中的行,而不仅仅是为了显示额外的列。例如:

INSERT INTO tableA (col1) VALUES (10), (20), (30);
INSERT INTO tableB (col1) VALUES (20);

SELECT tableA.col1 FROM tableA;

返回三行:10、20 和 30。

SELECT tableA.col1 FROM tableA JOIN tableB ON tableA.col1 = tableB.col1;

返回一行:20。

因此,在您的示例中,连接意味着查询仅返回那些在 addresses 中具有匹配行的 clients

【讨论】:

  • 感谢您解释我根本不需要那个,因为我所有的数据都只在一个表中。由于我的示例中的查询似乎是查询的参数而不是查询本身,因此仅将其替换为包含我的数据的表的名称就足够了吗?
  • 如果没有看到查询和对查询所需结果的描述,我无法回答这个问题。你都没有提供。
【解决方案2】:

如果您删除联接,您将输出客户表中的所有行。如果这是你想要的,你可以删除连接,但我不这么认为。联接实际上是在过滤您的输出,只为客户端提供clients.uuid = addresstorecord.recordid 所在的行,依此类推。我认为您希望在输出中看到的所有数据都在 clients 表中,但您需要过滤的数据不是,所以您需要连接。

【讨论】:

    猜你喜欢
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    相关资源
    最近更新 更多