【问题标题】:Return Rows, when two conditions that are true返回行,当两个条件为真时
【发布时间】:2022-01-02 21:41:09
【问题描述】:

以下查询可以正常返回数据:

SELECT DISTINCT
    CONVERT(varchar, b.bookindt, 101) AS [book-in date],
    b.bookinno AS [book-in no.],
    dbo.fn_getoffensedesc(o.offenseid, o.probviolation,
                          (select offense from trdcode61 
                           where code61id = o.code61id), o.goc) AS offensedescription,
    o.PrimaryOffense AS [Primary Offense],
    trd.l_d AS [offense l/d],
    p.firstname AS [first name],
    p.lastname AS [last name]
FROM
    tblpeople p
LEFT OUTER JOIN 
    tbloffense o (NOLOCK) ON o.personid = p.personid 
LEFT OUTER JOIN 
    tblbookin b (NOLOCK) ON b.bookinid = o.bookinid 
LEFT OUTER JOIN 
    trdcode61 trd (NOLOCK) ON trd.code61id = o.code61id 
WHERE
    dbo.fn_isinjailbybookinid(b.bookinid) = 1 
    -- AND b.bookinno='21042173'
    AND (trd.l_d LIKE 'F%' OR trd.l_d LIKE 'M%')
ORDER BY
    p.lastname, p.firstname 

为了更清楚,这里是单个“bookinno”的结果截图:

我需要查询方面的帮助,它会查看“预订号”。列并且如果“Offense l/d”列包含(trd.l_d like 'F%' AND trd.l_d like 'M%'),则返回该“预订编号”。结果。

当我尝试使用 AND 运行时,结果为零。

我确实有“预订号”。只有“F%”或只有“M%”。

不胜感激。

问候, 耶

【问题讨论】:

  • 停止使用nolock 溅出您的代码。但是,如果您这样做并了解风险,至少使用当前语法,而不是不推荐使用的语法。
  • where b.bookinno='21042173' and (trd.l_d like 'F%' or trd.l_d like 'M%') 对我来说你的查询看起来不错。我怀疑这不起作用dbo.fn_isinjailbybookinid(b.bookinid) = 1
  • @SMor,nolock 的最新语法是什么?
  • 使用没有聚合的 GROUP BY 有难闻的气味。但也许 trd.l_d 列不包含您假设的内容。将该列转换为 varbinary(20) 以查看它实际包含的内容。
  • 如果您“必须”拥有GROUP BY,请改用DISTINCT;当你没有聚合时,分组是没有意义的。

标签: sql sql-server group-by sql-server-2012


【解决方案1】:

您可以使用您的条件过滤结果集,按bookinno 分组并在HAVING 子句中设置条件,以便这两个条件都适用于bookinno

SELECT b.bookinno AS [book-in no.]
FROM tblpeople p
INNER JOIN tbloffense o ON o.personid = p.personid 
INNER JOIN tblbookin b ON b.bookinid = o.bookinid 
INNER JOIN trdcode61 trd ON trd.code61id = o.code61id 
WHERE dbo.fn_isinjailbybookinid(b.bookinid) = 1 
  AND (trd.l_d LIKE 'F%' OR trd.l_d LIKE 'M%')
GROUP BY b.bookinno
HAVING COUNT(DISTINCT LEFT(trd.l_d, 1)) = 2;

请注意,此要求的连接应该是 INNER 而不是 LEFT,因为您不希望结果中有任何不匹配的行。

【讨论】:

  • 感谢您的回复和代码。然而;我需要它查看 b.bookino,如果这两个条件为真(trd.l_d LIKE 'F%' 和 trd.l_d LIKE 'M%'),返回那个 b.bookino。谢谢
  • @jr7138 这就是查询的作用。如果您想要特定 bookino 的结果,请添加到 WHERE 子句:AND bookino = '21042173'
  • 是的,我同意。但是,我需要代码查看 b.bookinno “和”,然后查看 trd.l_d 并且如果 b.bookinno 同时具有 ("F% AND "M%"),则返回 b.bookinno。跨度>
  • @jr7138 你试过代码了吗? group by 和 having 子句完全符合您的要求。
  • 是的。但是,这仍然不是我需要的结果。让我放一些代码和屏幕截图给你看。糟糕,不能那样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
  • 2018-04-10
  • 2021-12-06
相关资源
最近更新 更多