我有两张桌子 -
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 用户表单表。
一次 Contract_No 只能出现一次 Company_Form表
我的逻辑是:
问题在于我无法在SQL中构建可以为我执行任务的查询。
请帮我制定查询。
[PS]我在PHP中使用SQL。
我尝试了一个类似的查询:
我尝试了一种方法:
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;
但是我收到一个错误,即子查询返回超过1行。 我可以从中获得帮助吗?
答案 0 :(得分:0)
我假设您正在尝试查找用户所选软件及其相应发票的最新价格。这是一种方法。如果测试结果令您满意,我可以添加必要的解释。
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
答案 1 :(得分:0)
If the requirement allows your sub query to return more than one row, I would suggest you to use IN instead of = in the where clause of your main query.
Please note that I have just looked at the query and have not fully understood the requirements.
Thanks.
答案 2 :(得分:0)
我工作了一段时间,最后来到了以下查询,其功能就像魅力
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;
如果有人需要帮助来理解此查询的逻辑,请随时在下面发表评论。