【问题标题】:Where to place this WHERE clause?在哪里放置这个 WHERE 子句?
【发布时间】:2018-04-16 23:58:15
【问题描述】:

标题可能听起来很愚蠢,但我不知道还能给它起什么名字。事先很抱歉。

我的问题。我发现这个旧查询需要修改。

SELECT t.batchid, t.SQLidentity, t.qvardenum, t.kassorsakskod, t.editint, t.rowcreatedby
FROM dbo.qdin t
INNER JOIN (
SELECT batchid, max(sqlidentity) AS MaxId
FROM dbo.qdin
WHERE qparamid = 1
GROUP BY batchid)
tm on t.batchid = tm.batchid AND t.sqlidentity = tm.MaxId

我需要为它添加列 tiq.qparamgrupp 和 Where 子句。我设法加入表格并添加列,但我似乎无法添加 Where 子句。

这是我现在的查询。

SELECT t.batchid, 
       t.sqlidentity, 
       t.qvardenum, 
       t.kassorsakskod, 
       t.editint, 
       t.rowcreatedby, 
       tiq.qparamgrupp 
FROM   dbo.qdin t 
       INNER JOIN dbo.tiq 
               ON tiq.aonr = T.aonr 
                  AND tiq.aopos = T.aopos 
                  AND tiq.dummyuniqueid = T.conndummyuniqueid 
       INNER JOIN (SELECT batchid, 
                          Max(sqlidentity) AS MaxId 
                   FROM   dbo.qdin 
                   WHERE  qparamid = 1 
                   GROUP  BY batchid) tm 
               ON t.batchid = tm.batchid 
                  AND t.sqlidentity = tm.maxid 
WHERE  tiq.qparamgrupp = 2 

它什么也不返回。

编辑 这是内容的一部分。

qdin.batchid    qdin.qparamid   tiq.qparamgrupp qdin.qvardenum
(03-2020 10471)     1                  2             5,26
(03-2020 10471)     1                  3             5,23
(03-2020 10471)     2                  3             3290
(03-2020 10471)     2                  2             3400
(03-2020 10471)     3                  4              0
(03-2020 10471)     4                  2    
(03-2020 10471)     4                  3    
(03-2020 10471)     5                  3    
(03-2020 10471)     5                  2    

如果我在没有“WHERE tiq.qparamgrupp = 2”的情况下运行查询,我会得到这个

qdin.batchid    qdin.qparamid   tiq.qparamgrupp qdin.qvardenum
(03-2020 10471)     1                  3             5,23

当我真的想要这个时。

qdin.batchid    qdin.qparamid   tiq.qparamgrupp qdin.qvardenum
(03-2020 10471)     1                  2             5,26

EDIT2 如果我运行这个

SELECT t.batchid, t.qparamid, 
   t.sqlidentity, 
   t.qvardenum,  
   tiq.qparamgrupp 
FROM   dbo.qdin t 
   INNER JOIN dbo.tiq 
           ON tiq.aonr = T.aonr 
              AND tiq.aopos = T.aopos 
              AND tiq.dummyuniqueid = T.conndummyuniqueid 
              AND tiq.qparamgrupp = 2 
WHERE t.batchid = '03-2020 10471' AND t.qparamid = 1 AND tiq.qparamgrupp = 2

我明白了

    batchid    qpramid    sqlidentity    qvardenum    qparamgrupp
03-2020 10471     1          32278       5.2600000         2

哪个好。但问题是当我运行另一个“batchid”并且有 2 条记录具有相同的“qparamid”和“qparamgrupp”时。这就是为什么我想要最后一条记录时有“max(sqlidentity)”。

例子

 SELECT t.batchid, t.qparamid, 
   t.sqlidentity, 
   t.qvardenum,  
   tiq.qparamgrupp 
FROM   dbo.qdin t 
   INNER JOIN dbo.tiq 
           ON tiq.aonr = T.aonr 
              AND tiq.aopos = T.aopos 
              AND tiq.dummyuniqueid = T.conndummyuniqueid 
              AND tiq.qparamgrupp = 2 
WHERE t.batchid = '03-2020 10470' AND t.qparamid = 1 AND tiq.qparamgrupp = 2

给我这个

    batchid    qpramid    sqlidentity    qvardenum    qparamgrupp
03-2020 10470     1          32112       5.2300000         2   
03-2020 10470     1          32235       5.3000000         2   

有没有更简单的方法或另一种方法来写这个,这样我就只能得到

03-2020 10470     1          32235       5.3000000         2   

提前致谢

西苏

【问题讨论】:

  • 您的查询似乎没问题。最喜欢的是在该连接上没有任何带有qparamgrupp = 2 的行。尝试删除第二个加入并检查是否有任何结果。如果有,请检查它们是否与第二个连接匹配。您也可以尝试使用LEFT JOIN 而不是INNER JOIN
  • 这可能是因为您的任何 JOINS 或 WHERE 子句都找不到匹配项。先尝试不使用 where 条件。即使那样它也没有给您结果,请一一访问您的JOINS。
  • 编辑了部分内容。
  • 可能是因为我想要子查询中的 MAX sqlidentity 并且与外部子句不匹配?

标签: sql sql-server


【解决方案1】:

试试这个:

   SELECT t.batchid, 
       t.sqlidentity, 
       t.qvardenum, 
       t.kassorsakskod, 
       t.editint, 
       t.rowcreatedby, 
       tiq.qparamgrupp 
FROM   dbo.qdin t 
       INNER JOIN dbo.tiq 
               ON tiq.aonr = T.aonr 
                  AND tiq.aopos = T.aopos 
                  AND tiq.dummyuniqueid = T.conndummyuniqueid 
                  AND tiq.qparamgrupp = 2 
       INNER JOIN (SELECT batchid, 
                          Max(sqlidentity) AS MaxId 
                   FROM   dbo.qdin 
                   WHERE  qparamid = 1 
                   GROUP  BY batchid) tm 
               ON t.batchid = tm.batchid 
                  AND t.sqlidentity = tm.maxid 

【讨论】:

  • 感谢您的回答。然而,这也给了我 0 个结果。我已经更新了我的问题(EDIT2)。
  • 如果您可以使用 sqlfiddle.com 插入数据,我会找到您的答案,我至少需要相关表的 create table 语句,并且最好有示例数据的 insert 语句您正在显示,感觉像是 2 个表共有的字段不在连接子句中
  • 我不确定如何使用 sqlfiddle。我做了一个 SELECT INTO NEWTABLE 并尝试使用 SSMS 编写创建表的脚本。但我似乎无法使用脚本给我的查询创建表? PS:抱歉回复晚了。
【解决方案2】:

我现在设法解决了这个问题,只是想发布我的答案。感谢你的帮助。

SELECT t.batchid, 
   t.qparamid, 
   t.sqlidentity, 
   t.qvardenum,  
   tiq.qparamgrupp 
FROM   dbo.qdin t 
   INNER JOIN dbo.tiq 
           ON tiq.aonr = T.aonr 
              AND tiq.aopos = T.aopos 
              AND tiq.dummyuniqueid = T.conndummyuniqueid
WHERE 
t.sqlidentity = (SELECT
Max(sqlidentity) AS MaxID 
FROM dbo.qdin t
   JOIN dbo.tiq 
           ON tiq.aonr = T.aonr 
              AND tiq.aopos = T.aopos 
              AND tiq.dummyuniqueid = T.conndummyuniqueid
WHERE t.batchid = '03-2020 10470' AND t.qparamid = 1 AND
tiq.qparamgrupp = 2)

【讨论】:

    猜你喜欢
    • 2013-05-21
    • 1970-01-01
    • 2015-02-28
    • 2013-03-07
    • 2019-01-10
    • 1970-01-01
    • 2011-08-27
    • 2017-11-17
    • 1970-01-01
    相关资源
    最近更新 更多