2016-07-11 6 views
2

이 특정 열이 테이블에 있고 다른 테이블과 조인하는 SQL 문을 작성했으며 기본 키 ReportID가 두 테이블 간의 링크 역할을합니다. 회사의 보고서를 정확하게 표시하기 위해 NOT IN을 사용하고 있지만 회사를 선택하면 결과가 표시되지 않습니다. 다시 정렬해야하는 쿼리가 있습니까?NOT IN과 SQL join

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 
+0

MySQL과 SQL-Server는 실제로 사용하고있는 것과 다릅니다. – Barmar

+2

SQL 인젝션에 노출되기 전에 매개 변수화 된 쿼리를 읽고 이해하고 시작해야합니다. –

+4

'not in'은 가입 한 바로 그 테이블의 모든 레코드를 제외하고 모든 레코드를 선택합니다. –

답변

0

NOT IN은 방금 조인에 사용하는 경우에 사용하는 이유에 대한 필요를 키우면되지, 그것의 어떤 이익을, 당신은 다른 레코드를 선택해야 만하는 경우 유일한 방법이 없습니다 같은 테이블 (트리 구조와 같은 것을 사용할 때), 당신이하려는 것은 모든 결과가 0 레코드가 될 것입니다. 가입과 같이

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 
+1

저는 처음에는 효과가 있었지만 예상보다 많은 가치를 보여줄 것이라는 것을 깨달았습니다. 그래서 그 의도는 그 성명서에 충실하고 회사에 관계없이 모든 보고서를 보여 주었지만 검사되지 않은 보고서 또는 정확한 null 값. 자, 당신이 0 기록에 대해 말한 것은 지금 제가 경험하고있는 것입니다. –

+0

null 결과가 "오른쪽 조인"(이 경우 왼쪽 테이블에서 다른 테이블에없는 경우 오른쪽 조인을 반환하면 null)을 사용하는 것보다 "내부 조인"만 사용하면 안쪽 가입하십시오. –

+1

내부 참여를 사용하여 회사에 적절한 보고서를 받았습니다. 그러나 이제는 적절한 보고서가 표시되었지만 회사에 적합하지 않은 다른 보고서가 표시되지 않았다고 가정 해 봅시다. 다시 가입하거나 NOT IN 또는 NOT EXIST 중 하나를 사용 하시겠습니까? –

1

I 돈

나는 그냥 이런 식으로 뭔가를 원 생각 모든 보고서를 제외하고 싶다고 생각하지 않습니다. 서로 다른 두 테이블의 목적을 추측하기는 정말 어렵지만 제외하려고하는 보고서 목록을 정리해야한다고 생각합니다. (다른 답변에서 당신은 "선택하지 않은 보고서 또는 null 값"을 참조하십시오.)

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 = ? 
+0

나는 체크 박스가 나타나게 할 수 있었고, 체크 박스의 수는 다양 할 것이고, 그 수는 회사에 맞는 체크 박스의 수를 의미한다. ReportName이 표시되지 않거나 바인딩 할 수없는 문제가있었습니다. –

0

그래서 여기에 내가이 문제를 해결하기 위해 무슨 짓을했는지 : 권리를 유지, DISTINCT 키워드를 제거 두 개의 테이블에 가입 할 수 있습니다. 보고 목록을 1로 설정하십시오. 회사가 드롭 다운 목록에서 선택되면, NOT IN을 사용하지 않고 IN을 사용하여 ReportList 테이블 r1 아래의 reportID를 테이블 2의 ReportList에서 ReportID를 선택하고 표시 및 순서를 유지하십시오 그것은 명확성을위한 이름입니다. 이를 유지함으로써 각 회사에 대한 결과를 정확하게 표시하지만 이번에는 회사별로 연관성이없는 것을 선택 취소합니다. 따라서 회사 당 보고서 수에 관계없이 관련 보고서가 표시됩니다. 올바른 쿼리는 다음과 같습니다

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"