Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查询连接与优化_Sql_Sql Server - Fatal编程技术网

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是相等联接。请参见子查询是有效的还是联接?子查询是有效的还是联接?