Запросить выбранные столбцы из двух таблиц с условием условия

0

У меня два 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

  • Полученные записи должны быть группами по последней версии Invoice_Date

Я пришел к логике, что:

  1. Я должен сначала получить все номера контрактов с этим именем программного обеспечения из таблицы Company_Form.
  2. Я должен запросить этот номер контракта из таблицы User_Form и отобразить данные для каждого согласованного контракта. из таблицы 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 строки. Могу ли я получить помощь от этого?

  • 0
    I am using SQL ... какую версию SQL вы на самом деле используете?
  • 0
    + Tim Biegeleisen MySQL, который поставляется с Xampp 5.6.32
Показать ещё 6 комментариев
Теги:

3 ответа

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;

Если кому-то нужна помощь в понимании логики этого запроса, не стесняйтесь комментировать ниже.

0

Если это требование позволяет вашему суб-запросу возвращать более одной строки, я предлагаю вам использовать IN вместо = в предложении where вашего основного запроса.

Обратите внимание, что я только что просмотрел запрос и не полностью понял требования.

Благодарю.

  • 0
    Цель состоит в том, чтобы просмотреть даты счета-фактуры в порядке убывания этого конкретного программного обеспечения. Таблица User_Form не содержит имени программного обеспечения, поэтому нам нужно извлечь все номера контрактов, соответствующие программному обеспечению, из таблицы Company_Form.
  • 0
    Таблица User_form содержит номера контрактов, поэтому мы сравниваем, если какой-либо контракт номер. в строке соответствует номерам, выбранным из Company_form. Если да, эта строка печатается.
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
  • 0
    Я только что отредактировал свой вопрос ... не могли бы вы пройти и помочь мне с моим запросом один раз?
  • 0
    На самом деле я хочу отобразить полный список счетов для этого конкретного программного обеспечения в порядке убывания, то есть самая последняя дата счета должна стоять первой в таблице.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню