У меня два tables-
1) **** Company_Form ****
[ Contract_No #, Software_Name, Company_Name, Vendor_Code]
2) **** User_Form ****
[Contract_No, Invoice_No #, Invoice_Date, Invoice_Amount, Invoice_Submit_Date]
Поля, обозначенные символом # и полужирным шрифтом, являются первичными ключами.
=> Пользователь должен ввести имя программного обеспечения, для которого он хочет получить данные.
=> Мне нужно структурировать запрос, в котором я должен отображать результат в следующей форме:
[Контракт №, Software_Name, Company_Name, Invoice_No, Invoice_Date, Invoice_Submission_Date]
Сейчас,
один Contract_No может содержать много Invoice_no под его именем в таблице User Form.
Один Contract_No может произойти один раз только в таблице Company_Form
Я пришел к логике, что:
Проблема в том, что я не могу структурировать запрос в SQL, который может выполнить эту задачу для меня.
Пожалуйста, помогите мне в формулировке запроса.
[PS] Я использую SQL с PHP.
Я попробовал запрос вроде:
Я пробовал один подход:
SELECT a.ContractNo,a.SoftwareName,a.CompanyName,b.InvoiceNo,b.InvoiceDate,b.InvAmount,b.InvoiceSubmitDate
FROM Company_Form as a,User_Form as b
WHERE b.ContractNo IN(SELECT ContractNo FROM Company_Form WHERE
SoftwareName='$Sname') AND a.ContractNo=b.ContractNo;
Но я получаю ошибку, что sub-запрос возвращает более 1 строки. Могу ли я получить помощь от этого?
Я работал некоторое время и, наконец, пришел к следующему запросу, который работает как шарм
SELECT a.ContractNo,a.SoftwareName,a.CompanyName,b.InvoiceNo,b.InvoiceDate,b.InvAmount,b.ISD
FROM Company_Form as a,User_Form as b
WHERE b.ContractNo IN (SELECT ContractNo FROM Company_Form WHERE SoftwareName='$Sname')
AND a.ContractNo=b.ContractNo;
Если кому-то нужна помощь в понимании логики этого запроса, не стесняйтесь комментировать ниже.
Если это требование позволяет вашему суб-запросу возвращать более одной строки, я предлагаю вам использовать IN вместо = в предложении where вашего основного запроса.
Обратите внимание, что я только что просмотрел запрос и не полностью понял требования.
Благодарю.
Я предполагаю, что вы пытаетесь найти самую последнюю цену выбранного пользователем программного обеспечения и соответствующий ему счет-фактуру. Вот такой подход. Если это будет проверено на ваше усмотрение, я могу добавить необходимое объяснение.
select uf.Contract_No#,
cf.Software_Name,
cf.Company_Name,
uf.Invoice_No#,
uf.Invoice_Date,
uf.Invoice_Amount,
uf.Invoice_Submit_Date
from User_Form uf
inner join (
-- Most recent sale of software
select Contract_No#, max(Invoice_Date)
from User_Form
group by Contract_No#
) latest
on (
-- Filter via join for latest match records
uf.Contract_No# = latest.Contract_No#
and uf.Invoice_Date = latest.Invoice_Date
)
inner join Company_Form cf
on cf.Contract_No# = uf.Contract_No#
where cf.Software_name = :software_name
I am using SQL
... какую версию SQL вы на самом деле используете?