Sql 查询连接与优化
我有一个表信息,它的设计是这样的Sql 查询连接与优化,sql,sql-server,Sql,Sql Server,我有一个表信息,它的设计是这样的 id - bigint Name - varchar2 refid - bigint status - int ExpDate - datetime 状态值可以是0,1,2,3,4 refid是我们也将要使用的其他表的外键 我想写一个查询,其中所有记录都应该来自此表,状态为0、1、2、3,但只有7条expdate最新记录的状态为4 我不知道如何在t-SQL中实现这一点 请帮助我或者给我一些建议,这样我就可以开始写了 到目前为止,我已经写过了 SELECT *
id - bigint
Name - varchar2
refid - bigint
status - int
ExpDate - datetime
状态值可以是0,1,2,3,4
refid是我们也将要使用的其他表的外键
我想写一个查询,其中所有记录都应该来自此表,状态为0、1、2、3,但只有7条expdate最新记录的状态为4
我不知道如何在t-SQL中实现这一点
请帮助我或者给我一些建议,这样我就可以开始写了
到目前为止,我已经写过了
SELECT *
FROM INFO
WHERE STATUS IN (0,1,2,3) AND
REFID IN (SELECT REFID FROM REFTABLE WHERE REFCHAIN='BMW')
SELECT TOP 7
FROM INFO
WHERE STATUS=4 AND
REFID IN(SELECT REFID FROM REFTABLE WHERE REFCHAIN='BMW')
ORDER BY EXPDATE DESC
我需要加入他们???怎样建议和查询
(SELECT REFID FROM REFTABLE WHERE REFCHAIN='BMW')
即将推出两次如何对其进行优化谢谢。您是要对此进行优化,还是仅删除重复记录 如果要删除重复记录,可以尝试使用UNION-
SELECT * FROM INFO
INNER JOIN REFTABLE ON INFO.refId = REFTABLE.Id
WHERE REFCHAIN = 'BMW' AND INFO.status IN (0,1,2,3)
UNION
SELECT FROM
(
SELECT TOP 7 FROM INFO
INNER JOIN REFTABLE ON INFO.refId = REFTABLE.Id
WHERE INFO.status=4 AND REFCHAIN='BMW'
ORDER BY EXPDATE DESC
) T
您想对此进行优化还是只删除重复记录 如果要删除重复记录,可以尝试使用UNION-
SELECT * FROM INFO
INNER JOIN REFTABLE ON INFO.refId = REFTABLE.Id
WHERE REFCHAIN = 'BMW' AND INFO.status IN (0,1,2,3)
UNION
SELECT FROM
(
SELECT TOP 7 FROM INFO
INNER JOIN REFTABLE ON INFO.refId = REFTABLE.Id
WHERE INFO.status=4 AND REFCHAIN='BMW'
ORDER BY EXPDATE DESC
) T
只要将当前的两个查询合并在一起,您就需要一个派生表来获得顶部
SELECT ...
FROM INFO
WHERE STATUS IN (0,1,2,3) AND
REFID IN (SELECT REFID FROM REFTABLE WHERE REFCHAIN='BMW')
UNION ALL
SELECT ...
FROM
(
SELECT TOP 7 ...
FROM INFO
WHERE STATUS=4 AND
REFID IN(SELECT REFID FROM REFTABLE WHERE REFCHAIN='BMW')
ORDER BY EXPDATE DESC
) T
你可以变得更花哨,但它可能没有那么高效:
SELECT *
FROM
(
SELECT ...,
ROW_NUMBER() OVER (ORDER BY EXPDATE DESC) AS rn
FROM INFO
WHERE REFID IN (SELECT REFID FROM REFTABLE WHERE REFCHAIN='BMW')
) T
WHERE
rn <= 7 OR STATUS <= 4
只要将当前的两个查询合并在一起,您就需要一个派生表来获得顶部
SELECT ...
FROM INFO
WHERE STATUS IN (0,1,2,3) AND
REFID IN (SELECT REFID FROM REFTABLE WHERE REFCHAIN='BMW')
UNION ALL
SELECT ...
FROM
(
SELECT TOP 7 ...
FROM INFO
WHERE STATUS=4 AND
REFID IN(SELECT REFID FROM REFTABLE WHERE REFCHAIN='BMW')
ORDER BY EXPDATE DESC
) T
你可以变得更花哨,但它可能没有那么高效:
SELECT *
FROM
(
SELECT ...,
ROW_NUMBER() OVER (ORDER BY EXPDATE DESC) AS rn
FROM INFO
WHERE REFID IN (SELECT REFID FROM REFTABLE WHERE REFCHAIN='BMW')
) T
WHERE
rn <= 7 OR STATUS <= 4
对于ur REF表中的最新7个值,u可以使用此查询- 从REFID不在的REFTABLE中选择* 从REF表格的info REFID中选择top select count*-7
如果您可以发布表结构,那就更好了。对于ur REF表中的最新7个值,您可以使用此查询- 从REFID不在的REFTABLE中选择* 从REF表格的info REFID中选择top select count*-7
如果你能发布表格结构就更好了。gbn和Pavanred关于UNION的答案可以解决你的问题,如何加入这些结果。 如果涉及到优化,您可以为select的结果创建临时表。然后查询只执行一次 但是。。。 我认为查询太琐碎了,无法以这种方式进行优化 无论如何:
SELECT REFID
INTO #temp1
FROM REFTABLE WHERE REFCHAIN='BMW'
然后在这两个查询中都使用它:
WHERE REFID IN (SELECT REFID FROM #temp1)
还是那样
SELECT ...
FROM INFO inf
INNER JOIN #temp1 t ON inf.REFID = t.REFID
...
gbn和Pavanred关于联合的回答解决了您如何加入此结果的问题。 如果涉及到优化,您可以为select的结果创建临时表。然后查询只执行一次 但是。。。 我认为查询太琐碎了,无法以这种方式进行优化 无论如何:
SELECT REFID
INTO #temp1
FROM REFTABLE WHERE REFCHAIN='BMW'
然后在这两个查询中都使用它:
WHERE REFID IN (SELECT REFID FROM #temp1)
还是那样
SELECT ...
FROM INFO inf
INNER JOIN #temp1 t ON inf.REFID = t.REFID
...
是否要优化查询或删除重复记录?没有重复记录,因为状态不同。确定。。下面是两次关于如何优化它的讨论,谢谢。。让我觉得可能有重复记录。我们在其中使用子查询。。重复相同的子查询。。我要优化partsubqueries是否快速或联接?是否要优化查询或删除重复记录?没有重复记录,因为状态不同。确定。。下面是两次关于如何优化它的讨论,谢谢。。让我觉得可能有重复记录。我们在其中使用子查询。。重复相同的子查询。。我想优化partsubqueries是fast还是JOIN?请注意,UNION增加了开销,这可以避免在中使用或存在。原因:IN/EXISTS是半联接,join是相等联接。请参见注意,联合增加了开销,这可以避免在中使用或存在。原因:IN/EXISTS是半联接,join是相等联接。请参见子查询是有效的还是联接?子查询是有效的还是联接?