【问题标题】:SQL Query - Table Joining ProblemsSQL 查询 - 表连接问题
【发布时间】:2013-07-05 02:55:33
【问题描述】:

我在思考如何针对我的情况构建适当的查询时遇到了一些严重的问题。很确定这取决于正确加入表格,但经过大量谷歌搜索后我似乎无法弄清楚...

我有以下表格..

Main:
ID, WhenDate, InfoText, StatusID, TypeID

还有……

Status:
ID, StatusText    

还有……

Secondary:
MainID, WhenDate

希望我能够正确解释这一点.. 我在 Main 中有一堆记录,我需要从中获取信息。我需要能够过滤 WhenDate 和 TypeID。我还需要从与 StatusID 链接的状态表中获取 StatusText。
问题:
表 Secondary 链接到 Main 中的记录,Secondary 中的任何记录都应生成与 Main 中的记录相同的行,不同之处在于使用 Secondary 中的 WhenDate 而不是 Main 中的 WhenDate。

非常感谢任何帮助,即使它只是一个提示,例如要使用什么类型的连接或其他什么...

【问题讨论】:

  • 如果您使用多个连接,您可以完成您所寻找的。​​span>
  • 您使用的是什么关系型数据库?到目前为止,您尝试过什么查询?

标签: sql join


【解决方案1】:

我使用INNER JOIN 表示状态,假设每个主记录都引用现有的状态记录。如果不是这种情况,您可能需要将其更改为 LEFT JOIN

对于WhenDate,您可以直接离开加入Secondary。如果找到记录,您可以与 Secondary.WhenDate 进行比较,否则,请与 Main.WhenDate 进行比较。

SELECT
  m.ID as MainID,
  m.WhenDate as MainWhenDate, 
  m.InfoText, 
  m.StatusID,
  st.StatusText,
  m.TypeID,
  s.WhenDate as SecondaryWhenDate,
  CASE WHEN s.MainID IS NULL THEN 
    m.WhenDate 
  ELSE 
    s.WhenDate 
  END AS ActualWhenDate
FROM
  Main m
  INNER JOIN Status st ON st.ID = m.StatusID
  LEFT JOIN Secondary s ON s.MainID = m.ID
WHERE
  ( s.MainID IS NULL AND m.WhenDate = <YourDate>
    OR
    s.MainID IS NOT NULL AND s.WhenDate = <YourDate> )
  AND TypeId = <TypeFilter>
  AND ... other filters, if you need any ...

【讨论】:

  • 有效!!非常感谢!虽然它明显很慢......有人想优化它吗???
    stackoverflow.com/questions/17477430/…>
  • 我认为你提出了一个关于它的新问题做得很好,但恐怕没有多少人愿意回答“我不知道该怎么做,你能做到吗”之类的问题为了我?”。所以,我会给你一个提示来帮助你:添加索引。 :)
猜你喜欢
  • 2014-03-28
  • 1970-01-01
  • 2014-06-04
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多