【问题标题】:sql join with not in column include in result不包含在列中的 sql join 包含在结果中
【发布时间】:2013-01-26 14:44:21
【问题描述】:

我有两张这样的桌子

id   Name    allocation
2    Ash      15
3    Alam     18
4    Rifat    20

Date   Id    Present
24     2     10
24     3     15
25     2     10
25     3     12
25     4     12

现在我想得到以下结果

     Date  Id Alloc   Present
      24   2   15     10        
      24   3   18     15
      24   4   20     NULL
      25   2   15     10
      25   3   18     12
      25   4   20     12

我已经尝试过JOIN 查询,但它没有给出想要的结果 如何得到上述结果?

【问题讨论】:

  • rifat 在第二张表中没有条目。但我想将他作为 NULL 或零包含在结果集中。每个不同的日期都有权加入第一张表

标签: sql sql-server-2008 join


【解决方案1】:
SELECT 
    t1.id
  , dd.date
  , t1.allocation
  , t2.present 
FROM 
    table1 AS t1                         --- all items
  CROSS JOIN
    ( SELECT DISTINCT date
      FROM table2
    ) AS dd                              --- all dates
  LEFT JOIN
    table2 AS t2                         --- present allocations
      ON  t2.id = t1.id
      AND t2.date = dd.date ;

在 SQL-Fiddle 测试:test(谢谢@JW。)

【讨论】:

  • @njk:已更正(缺少一些逗号,表名有 2 l)
  • 这样的查询的问题是,如果所有项目的日期值都缺失,它将不会显示在结果中。这就是为什么最好有一个单独的日期表。你的OUTER JOIN 也会更简单。
【解决方案2】:

还有一种有趣的方式:

SELECT 
    t2.date,
    t1.id,
    t1.allocation,
    MAX(CASE WHEN t1.id = t2.id THEN t2.Present ELSE NULL END)
FROM 
    table1 t1, table2 t2
GROUP BY 
    t1.id, t2.date, t1.allocation
ORDER BY 
    t2.date, t1.id

盗自:SQL query inner join with 0 values

http://www.sqlfiddle.com/#!3/d2ded/44

【讨论】:

  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(20 多年前),不鼓励使用它
  • 这是某个博客的广告吗?继续并使用JOIN 发布答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多