NOT IN и SQL-соединение

Я написал оператор SQL, в котором эти конкретные столбцы взяты из таблицы, и он соединяется с другой таблицей, а первичный ключ ReportID служит связующим звеном между двумя таблицами. Я использую NOT IN для точного отображения отчетов компании, но я не получаю вывод, когда компания выбрана. Есть ли где-нибудь в запросе, что я должен был бы изменить?

    valsql1 = "SELECT DISTINCT c.ReportID, c.COMPANYID, rl.REPORTNAME 
                FROM  CompanyReportListTable c 
                right join ReportList rl  on c.reportid = rl.ReportID 
                WHERE c.reportid  NOT IN(Select rl.ReportID FROM ReportList rl) 
                and rl.ReportVisible = 1 
                and CompanyID = " & DropDownList1.SelectedValue

3 ответа

Я не думаю, что вы хотели исключить все отчеты. Трудно догадаться о назначении двух разных таблиц, но я считаю, что вам просто нужно урезать список отчетов, которые вы пытаетесь исключить. (В другом ответе вы ссылаетесь на "непроверенные отчеты или нулевые значения".)

SELECT ReportID, COMPANYID, REPORTNAME 
FROM CompanyReportListTable c
WHERE
    ReportID NOT IN
        (
        SELECT rl.ReportID FROM ReportList rl
        WHERE ... /* which reports are you trying to exclude? */
        ) 
    AND ReportVisible = 1 AND CompanyID = ?

NOT IN в этом нет необходимости, поэтому вы используете его, если вы просто используете в соединении, это не дает никакой выгоды, единственный способ, только если вам нужно выбрать другую запись из той же таблицы (когда вы используете что-то как древовидная структура), то, что вы пытаетесь сделать, это то, что все результаты будут нулевыми записями.

Я думаю, вы просто хотели что-то вроде этого:

valsql1 = "SELECT DISTINCT c.ReportID, c.COMPANYID, rl.REPORTNAME 
   FROM  CompanyReportListTable c 
         right join ReportList rl  on c.reportid = rl.ReportID 
   WHERE rl.ReportVisible = 1 
         and CompanyID = " & DropDownList1.SelectedValue

И с внутренним соединением выглядят так:

valsql1 = "SELECT DISTINCT c.ReportID, c.COMPANYID, rl.REPORTNAME 
   FROM  CompanyReportListTable c 
         inner join ReportList rl  on c.reportid = rl.ReportID 
   WHERE rl.ReportVisible = 1 
         and CompanyID = " & DropDownList1.SelectedValue

Последний пример с левым соединением:

valsql1 = "SELECT DISTINCT c.ReportID, c.COMPANYID, rl.REPORTNAME 
   FROM  CompanyReportListTable c 
         left join ReportList rl  on c.reportid = rl.ReportID 
   WHERE rl.ReportVisible = 1 
         and CompanyID = " & DropDownList1.SelectedValue

Итак, вот что я сделал, чтобы решить эту проблему: удалите ключевое слово DISTINCT, оставьте правильное соединение для двух таблиц. Установите для параметра reportvisible значение 1. После выбора компании из раскрывающегося списка, reportID в таблице ReportList, rl, не с помощью NOT IN, а с помощью IN, выберите ReportID из таблицы 2, ReportList, и оставьте его видимым и упорядочьте. по названию для ясности. Сохраняя его, он будет точно отображать результаты для каждой компании, но на этот раз отмените те, которые не связаны для каждой компании. Таким образом, независимо от количества отчетов на компанию, будут отображаться те, которые связаны с ней. Вот правильный запрос

valsql1 = "SELECT c.ReportID, c.COMPANYID, rl.REPORTNAME 
FROM  CompanyReportListTable c 
right  join  ReportList rl on c.reportid = rl.ReportID and reportvisible = 1 and CompanyID =" & DropDownList1.SelectedValue & " 
where rl.ReportID IN (Select ReportID from ReportList where ReportVisible = 1) 
order by ReportName"
Другие вопросы по тегам