【问题标题】:how to query sql cross-reference table [closed]如何查询sql交叉引用表[关闭]
【发布时间】:2014-01-25 22:26:07
【问题描述】:

我是 SQL 新手,遇到问题希望您能帮助我:

mysql5

表 TRAINING_REQUESTS

+------------+--------+ | ID_TR |领域 | +------------+--------+ | ... | .. | | 254 | .. | | ... | .. | | 286 | .. | | ... | .. | | 401 | .. | | ... | .. | | 405 | .. | | 406 | .. | | ... | .. | +------------+--------+

表 PLANNING_REQUESTS

+----------+----------+----------+ | ID_PR | ID_TR |培训师 | +----------+----------+----------+ | ... | ... | ... | |第475章254 |空 | |第476章254 |空 | |第477章254 |空 | | 478 | 286 |空 | |第479章286 |免费 | | 480 | 286 |免费 | | 481 | 401 |免费 | |第482章401 | 1 | |第483章401 |免费 | | 484 | 405 |空 | | 485 | 405 | 1 | |第486章405 | 5 | |第487章405 |免费 | | 488 | 406 | 1 | | 489 | 406 | 5 | | 490 | 406 | 5 | | 491 | 406 | 2 | | ... | ... | ... | +----------+----------+----------+

我需要三样东西:

预期结果

约束:所有不正常的training_requests(ID_TR),这意味着 (>> ALL TRAINING REQUESTS(ID_TR) 有 ALL ASSIGNED PLANNING REQUESTS(ID_PR) WITH TRAINER EQUALS(NULL 或 FREE)

+------------+--------+ | ID_TR |领域 | +------------+--------+ | 254 | .. | | 286 | .. | +------------+--------+

约束:几乎没问题的所有 training_requests (ID_TR),这意味着 (>> ALL TRAINING REQUESTS(ID_TR) 有 ALL ASSIGNED PLANNING REQUESTS(ID_PR) 与培训师至少有一次不同(空或免费) 并非所有都分配有培训师(不同于 NULL 或 FREE)

+------------+--------+ | ID_TR |领域 | +------------+--------+ | 405 | .. | +------------+--------+

约束:所有不正常和几乎正常的training_requests

+------------+------+ | ID_TR |字段 | +------------+------+ | 405 | .. | | 254 | .. | | 286 | .. | +------------+------+

谢谢大家!

【问题讨论】:

  • 您是否尝试过编写您的查询?
  • ofc 我试过但我是 sql 初学者,我不知道如何查询交叉引用表
  • 你知道JOIN是什么吗?还是EXISTS?
  • 是的,我知道吗?像内部连接
  • sub-queries 在WHERE 子句中怎么样?

标签: mysql sql cross-reference


【解决方案1】:

可以通过以下方式(可能效率低下):

#1(不行)

SELECT tr.*
FROM TRAINING_REQUESTS tr
JOIN PLANNING_REQUESTS pr ON tr.id_tr = pr.id_tr
GROUP BY pr.id_tr
HAVING SUM(CASE WHEN pr.trainer IS NULL or pr.trainer = 'FREE' THEN 1 ELSE 0 END) = COUNT(*)
;

#2(几乎可以)

SELECT tr.*
FROM TRAINING_REQUESTS tr
WHERE EXISTS (SELECT 1 
              FROM PLANNING_REQUESTS pr 
              WHERE tr.id_tr = pr.id_tr 
              AND pr.trainer IS NOT NULL AND pr.trainer <> 'FREE') 
  AND EXISTS (SELECT 1 
              FROM PLANNING_REQUESTS pr 
              WHERE tr.id_tr = pr.id_tr 
              AND (pr.trainer IS NULL OR pr.trainer = 'FREE'))        
;

#3

    SELECT tr.*
    FROM TRAINING_REQUESTS tr
    WHERE EXISTS (SELECT 1 
                  FROM PLANNING_REQUESTS pr 
                  WHERE tr.id_tr = pr.id_tr 
                  AND (pr.trainer IS NULL OR pr.trainer = 'FREE'))        
;

这是SQL Fiddle 的结果。

请注意,我在#2(以及因此,#3)中的结果与您的不同,因为它们包含 401。

【讨论】:

    【解决方案2】:
        SELECT tr.ID_TR,tr.field 
        FROM planning_requests pr 
        INNER JOIN training_requests tr 
        ON tr.ID_TR = pr.ID_TR 
        WHERE pr.ID_TR NOT IN 
          (
          SELECT cpr.ID_TR 
          FROM planning_requests cpr 
          WHERE trainer IS NOT NULL AND trainer <> 'FREE' 
          ) 
        GROUP BY ID_TR
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-23
      • 1970-01-01
      • 2015-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多