【问题标题】:JOIN returns all the data from the tableJOIN 返回表中的所有数据
【发布时间】:2013-08-27 17:28:12
【问题描述】:

我的 Select 命令有问题,首先,我需要在其他表上显示与 idHour 不同的所有时间,这是代码:

SELECT DISTINCT Hours 
FROM agenda_hours A 
JOIN appoitment_hour B 
    ON (A.idHours <> B.Hour);

结果:

+----------+ |小时 | +----------+ | 07:00 | | 07:30 | | 08:00 | | 08:30 | | 09:00 | | 09:30 | | 10:00 | | 10:30 | | 11:00 | | 11:30 | | 12:00 | | 12:30 | | 13:00 | | 13:30 | | 14:00 | | 14:30 | | 15:00 | | 15:30 | | 16:00 | | 16:30 | | 17:00 | | 17:30 | | 18:00 | | 18:30 | | 19:00 | | 19:30 | | 20:00 | +----------+

【问题讨论】:

  • 你为什么用MySQL标记这个 SQL Server

标签: mysql sql sql-server


【解决方案1】:

试试这个方法:

SELECT DISTINCT Hours 
FROM agenda_hours A 
LEFT JOIN appoitment_hour B 
    ON (A.idHours = B.Hour)
WHERE B.Hour is null;

【讨论】:

  • 但是没有一个 idHours 为空,这是表的主键
  • 我检查的是Hour而不是idHours
  • @Vinicius 如果您查看此SO question/answer,您将看到在LEFT JOIN 上,如果该值存在于第一个表中但不存在于第二个表中,则连接值可能为空。因此,这将返回 'agenda_hours' 表中不在 'appoi[n]tment_hour' 表中的所有时间。我也相信这是你想要的。 +1
【解决方案2】:

你想要的是类似的东西(是议程小时数的小时数吗?)

SELECT DISTINCT Hours
FROM agenda_hours
WHERE idHours NOT IN (SELECT DISTINCT Hour FROM appoitment_hour)

在给定 ON 条件的情况下,您遇到了问题,因为 JOIN 尝试将表中的所有行与另一个表中的所有行进行匹配。所以即使一个小时已经在另一个表中,该行将与所有其他行匹配

【讨论】:

  • 如果appoitment_hour.Hour 允许NULLs 那么NOT IN 应该避免。示例:SELECT 'Test' WHERE 1 NOT IN (2,3,NULL);
【解决方案3】:

根据包含Hours 列的表,您可以使用此查询:

SELECT  /*DISTINCT*/ Hours 
FROM    agenda_hours A 
WHERE   NOT EXISTS(SELECT * FROM appoitment_hour B WHERE A.idHours = B.Hour);

或者这个:

SELECT  /*DISTINCT*/ Hours 
FROM    appoitment_hour B
WHERE   NOT EXISTS(SELECT * FROM agenda_hours A WHERE A.idHours = B.Hour);

【讨论】:

    【解决方案4】:

    用于获取不匹配的记录

    SELECT b.Hour, a.idHours FROM appoitment_hour b
    LEFT JOIN agenda_hours a ON b.Hour = a.idHours
    GROUP BY  b.Hour HAVING a.idHours IS NULL
    

    【讨论】:

      猜你喜欢
      • 2022-01-02
      • 2021-02-09
      • 1970-01-01
      • 2021-06-09
      • 2015-08-25
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      相关资源
      最近更新 更多