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"