Оператор IN в SQL возвращает только 1-е значение
Я написал код на 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. Что я делаю неправильно?
1 ответ
Ваше предложение SQL IN является правильным. Ну, теоретически, по крайней мере.
Есть ряд проблем, которые могут вызывать что-то вроде этого - и трудно сказать без фактического сокращения проблемы до минималистического примера и включения примеров данных.
Некоторые возможности:
A) У вас фактически нет CounterParty 'B' - по крайней мере, это не соответствует остальным пунктам Where. Вы можете определить, так ли это, просто удалив этот раздел "CounterParty" в запросе и фактически убедившись, что действительно есть строки "B", которые не удаляются.
Б) Ваши данные не оправданы / дополнены / и т. Д., Как вы ожидаете. Есть ли пробелы перед 'B' в этих строках? Тогда ваше предложение "IN" не будет соответствовать.
C) У вас есть ошибка в предложении Where, которая удаляет допустимые строки. Я имею в виду, посмотрите на эти сегменты:
substr('20180602', 0, 5)
substr('20180602', 5,2)
substr('20180602', 7, 9)
... что на земле? Второй выглядит правильно. Третий может сработать, но только потому, что есть только два символа, которые нужно начинать с 7-й позиции (а это два символа, которые вы хотите). Но мне трудно поверить, что первый из этих субстратов действительно делает то, что вы хочу.
Честно говоря, все это сравнение дат просто ужасно. Я имею в виду, вы собираете строку даты... путем повторной сборки другой строки даты, которая уже является строковым литералом. А? Почему бы просто не использовать:
and ("Trade Details 2".MATURITY_DATE > DATE('2018-06-02'))
Во всяком случае, у меня возникает ощущение, что вы действительно не слишком старались решить эту проблему с вашей стороны, прежде чем писать здесь. Сколько разных способов вы подправили предложения WHERE, чтобы выяснить, что фильтрует ваши данные?