0

我用 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 for SQL 中运行此查询时,只会出现与 COUNTERPARTY 'A' 的交易,尽管我知道我们也与交易对手 B 和 C 进行了交易。我究竟做错了什么?

4

1 回答 1

1

您的 SQL 'IN' 子句是正确的。好吧,至少理论上是这样。

有许多问题可能会导致这样的事情——如果你没有真正将问题简化为一个极简示例并包含样本数据,就很难说清楚。

一些可能性:

A)您实际上没有CounterParty 'B' - 至少,这与您的其余 Where 子句不匹配。您可以通过简单地删除查询的“CounterParty”部分并实际验证确实存在未被删除的“B”行来确定是否是这种情况。

B)您的数据不符合您的期望/填充/等。 这些行中的“B”之前有空格吗?那么你的'IN'子句将不匹配。

C)您的 Where 子句中存在删除有效行的错误。 我的意思是,看看这些部分:

substr('20180602', 0, 5)
substr('20180602', 5,2)
substr('20180602', 7, 9)

... 到底怎么回事?第二个看起来是正确的。第三个可能有效,但只是因为从第 7 个位置开始只有两个字符(而且它们是您想要的两个字符)但我很难相信这些 substr 中的第一个实际上是在做你的事情想。

老实说,整个日期比较太可怕了。我的意思是,您正在组装一个日期字符串......通过重新组装一个已经是字符串文字的不同日期字符串。嗯?为什么不直接使用:

and ("Trade Details 2".MATURITY_DATE > DATE('2018-06-02'))

无论如何,我觉得你在发帖之前并没有真正努力解决这个问题。你用多少种不同的方式调整 WHERE 子句来找出是什么过滤掉了你的数据?

于 2018-07-17T18:10:35.803 回答