我不太擅长 SQL,所以我请你们帮忙写一个查询。
SQL 查询 - 表连接问题
我得到了答案,它有效!它只是明显缓慢。我讨厌这样做,但我真的希望有人想推荐一些优化查询的方法。我什至没有自己尝试过,因为我对 SQL 的了解不够,甚至无法开始使用谷歌搜索。
问问题
137 次
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 添加适当的索引,甚至可能教您如何确定您需要哪些索引并赋予您添加它们的权利。
我已经看到通过使用两个单独的、几乎相似的选择来解决OR
in子句的情况,这些选择由. 但我相信这个技巧主要在 Oracle 上有用,并且主要在具有适当索引的表上有用。不过值得一试。WHERE
USING 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 回答