0

我不太擅长 SQL,所以我请你们帮忙写一个查询。
SQL 查询 - 表连接问题
我得到了答案,它有效!它只是明显缓慢。我讨厌这样做,但我真的希望有人想推荐一些优化查询的方法。我什至没有自己尝试过,因为我对 SQL 的了解不够,甚至无法开始使用谷歌搜索。

4

2 回答 2

2

可能有帮助的是在您要加入的列上创建索引。例如;

CREATE INDEX name_for_index ON Main (StatusID);

它为此列生成一个查找表,执行查询的算法将使用该查找表。

编辑:如果您不允许更改数据库,您可能不走运。我见过在 JOIN 语句上放宽提高性能的情况,就是这样;

...
FROM
  Main m, Status st, Secondary s
WHERE
  st.ID = m.StatusID
  AND s.MainID = m.ID
  AND 
  ( 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 ...

然后处理你的其他情况,INNER JOIN需要更详细一点。

于 2013-07-04T20:03:48.583 回答
0

有时这样的技巧可能会奏效,但正如您所见,它主要使您的查询复杂化。但就像我在评论中所说的那样:我真的敦促您要求您的 DBA 添加适当的索引,甚至可能教您如何确定您需要哪些索引并赋予您添加它们的权利。

我已经看到通过使用两个单独的、几乎相似的选择来解决ORin子句的情况,这些选择由. 但我相信这个技巧主要在 Oracle 上有用,并且主要在具有适当索引的表上有用。不过值得一试。WHEREUSING ALL

SELECT
  x.*
FROM
  (SELECT
    m.ID as MainID,
    m.WhenDate as MainWhenDate, 
    m.InfoText, 
    m.StatusID,
    st.StatusText,
    m.TypeID,
    NULL AS SecondaryWhenDate,
    m.WhenDate 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>
  UNION ALL
  SELECT
    m.ID as MainID,
    m.WhenDate as MainWhenDate, 
    m.InfoText, 
    m.StatusID,
    st.StatusText,
    m.TypeID,
    s.WhenDate AS SecondaryWhenDate,
    s.WhenDate AS ActualWhenDate
  FROM
    Main m
    INNER JOIN Status st ON st.ID = m.StatusID
    INNER JOIN Secondary s ON s.MainID = m.ID
  WHERE
    s.WhenDate = <YourDate>) x
WHERE
  x.TypeId = <TypeFilter>
  AND ... other filters, if you need any ...
于 2013-07-04T20:25:36.493 回答