2013-07-04 60 views
2

我有一些严重的问题,包装我的头周围如何建立一个适当的查询我的情况..很确定这取决于正确地加入表,但我似乎无法想象出来后很多谷歌搜索...的SQL查询 - 表连接问题

我有以下的表..

Main: 
ID, WhenDate, InfoText, StatusID, TypeID 

和...

Status: 
ID, StatusText  

和...

Secondary: 
MainID, WhenDate 

希望我能够正确解释这一点.. 我有一堆记录在主要我需要获得信息..我需要能够过滤的WhenDate和TypeID。我还需要从状态表中获取与状态ID链接的StatusText。
问题:
该表辅助链接到Main中的记录,辅助节点中的任何记录应导致与Main中的记录相同的行,但使用辅助节点中的WhenDate而不是使用WhenDate主要。

任何帮助不胜感激,哪怕它只是一个提示,比如什么类型的连接使用或东西...

+0

如果您使用多个连接,则可以完成要查找的内容。 –

+1

您使用的是什么RDBMS?你到目前为止尝试过哪些查询? – gustavodidomenico

回答

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 ... 
+0

它的工作原理!非常感谢!这是明显缓慢,虽然...任何人都想优化它?
Dorf

+0

我认为你问了一个关于它的新问题,但恐怕没有多少人渴望回答这样的问题“我不知道该怎么做,你能为我做吗?”。所以,我会给你一个提示来帮助你:添加索引。 :) – GolezTrol