SQL 中的 IN 语句仅 returns 第一个值
IN statement in SQL only returns 1st value
我在 SQL 中编写了代码以从两个单独的表中提取数据并将它们连接在一起。我正在尝试使用 IN 语句来限定我的结果,以便只显示与某些交易对手的交易。
SELECT "Trade Details 2".Portfolio,
"Trade Details 2".CONTRACT_ID,
DATE("Trade Details 2".START_DATE) as START_DATE,
DATE(substr("Trade Details 2".MATURITY_DATE, 0, 5) || '-' || substr("Trade
Details 2".MATURITY_DATE, 5,2) || '-' || substr("Trade Details
2".MATURITY_DATE, 7, 9)) as MATURITY_DATE,
"Trade Details 2".NOTIONAL1,
"Trade Details 2".CONTRACT_NPV,
"Trade Details 2".COUNTERPARTYNAME,
"Trade Details".TERM
FROM "Trade Details 2"
JOIN "Trade Details"
WHERE "Trade Details 2".CONTRACT_ID="Trade Details".FCC_ID and
("Trade Details 2".NOTIONAL1 > "0.0") and
("Trade Details 2".MATURITY_DATE > DATE(substr('20180602', 0, 5) || '-' ||
substr('20180602', 5,2) || '-' || substr('20180602', 7, 9)) ) and
("Trade Details 2".COUNTERPARTYNAME IN ('A', 'B', 'C'))
ORDER BY "Trade Details 2".COUNTERPARTYNAME asc
然而,当我 运行 在 DB Browser 中查询 SQL 时,只有与 COUNTERPARTY 'A' 的交易出现,即使我知道我们与交易对手 B 和C也一样。我做错了什么?
您的 SQL 'IN' 子句是正确的。好吧,至少理论上是这样。
有很多问题可能会导致这样的事情 - 如果您不实际将问题简化为一个极简示例并包括示例数据,则很难判断。
一些可能性:
A) 你 没有 实际上有 CounterParty 'B' - 至少,没有 also 匹配其余的 Where 子句。您可以通过简单地删除查询的 'CounterParty' 部分并实际验证确实存在未被删除的 'B' 行来确定是否属于这种情况。
B) 您的数据 justified/padded/etc 与您预期的不同。 这些行中 'B' 之前是否有空格?那么您的 'IN' 子句将不匹配。
C) 你的 Where 子句中有一个错误正在删除有效行。 我的意思是,看看这些段:
substr('20180602', 0, 5)
substr('20180602', 5,2)
substr('20180602', 7, 9)
...到底是什么?第二个看起来是正确的。第三个可能有用,但只是因为从第 7 个位置开始只有两个字符(而且它们是你想要的两个字符)但我很难相信第一个 substr 实际上正在做你的事情想要。
老实说,整个日期比较太可怕了。我的意思是,您正在组装日期字符串...通过重新组装已经是字符串文字的 different 日期字符串。嗯?为什么不直接使用:
and ("Trade Details 2".MATURITY_DATE > DATE('2018-06-02'))
不管怎样,我觉得你在发帖之前并没有真正努力解决这个问题。您调整了多少种不同的 WHERE 子句来找出是什么过滤了您的数据?
我在 SQL 中编写了代码以从两个单独的表中提取数据并将它们连接在一起。我正在尝试使用 IN 语句来限定我的结果,以便只显示与某些交易对手的交易。
SELECT "Trade Details 2".Portfolio,
"Trade Details 2".CONTRACT_ID,
DATE("Trade Details 2".START_DATE) as START_DATE,
DATE(substr("Trade Details 2".MATURITY_DATE, 0, 5) || '-' || substr("Trade
Details 2".MATURITY_DATE, 5,2) || '-' || substr("Trade Details
2".MATURITY_DATE, 7, 9)) as MATURITY_DATE,
"Trade Details 2".NOTIONAL1,
"Trade Details 2".CONTRACT_NPV,
"Trade Details 2".COUNTERPARTYNAME,
"Trade Details".TERM
FROM "Trade Details 2"
JOIN "Trade Details"
WHERE "Trade Details 2".CONTRACT_ID="Trade Details".FCC_ID and
("Trade Details 2".NOTIONAL1 > "0.0") and
("Trade Details 2".MATURITY_DATE > DATE(substr('20180602', 0, 5) || '-' ||
substr('20180602', 5,2) || '-' || substr('20180602', 7, 9)) ) and
("Trade Details 2".COUNTERPARTYNAME IN ('A', 'B', 'C'))
ORDER BY "Trade Details 2".COUNTERPARTYNAME asc
然而,当我 运行 在 DB Browser 中查询 SQL 时,只有与 COUNTERPARTY 'A' 的交易出现,即使我知道我们与交易对手 B 和C也一样。我做错了什么?
您的 SQL 'IN' 子句是正确的。好吧,至少理论上是这样。
有很多问题可能会导致这样的事情 - 如果您不实际将问题简化为一个极简示例并包括示例数据,则很难判断。
一些可能性:
A) 你 没有 实际上有 CounterParty 'B' - 至少,没有 also 匹配其余的 Where 子句。您可以通过简单地删除查询的 'CounterParty' 部分并实际验证确实存在未被删除的 'B' 行来确定是否属于这种情况。
B) 您的数据 justified/padded/etc 与您预期的不同。 这些行中 'B' 之前是否有空格?那么您的 'IN' 子句将不匹配。
C) 你的 Where 子句中有一个错误正在删除有效行。 我的意思是,看看这些段:
substr('20180602', 0, 5)
substr('20180602', 5,2)
substr('20180602', 7, 9)
...到底是什么?第二个看起来是正确的。第三个可能有用,但只是因为从第 7 个位置开始只有两个字符(而且它们是你想要的两个字符)但我很难相信第一个 substr 实际上正在做你的事情想要。
老实说,整个日期比较太可怕了。我的意思是,您正在组装日期字符串...通过重新组装已经是字符串文字的 different 日期字符串。嗯?为什么不直接使用:
and ("Trade Details 2".MATURITY_DATE > DATE('2018-06-02'))
不管怎样,我觉得你在发帖之前并没有真正努力解决这个问题。您调整了多少种不同的 WHERE 子句来找出是什么过滤了您的数据?