我有3个表:artists
,transactions
和works
,包含以下字段:
artists
:ArtistsID
,LastName
,FirstName
transactions
:TransactionID,WorkID,CustomerID work
- WorkID
,ArtistsID
我想做的是:
选择其作品尚未被图库销售的每位艺术家的姓氏和名字。
到目前为止,我所做的是:
SELECT FirstName
, LastName
FROM listofartists
, work
, trans
WHERE listofartists.ArtistID = work.ArtistID
AND trans.WorkID NOT IN (
SELECT workID
FROM work
)
答案 0 :(得分:1)
使用left join
并检查是否可以与is null
SELECT listofartists.FirstName, listofartists.LastName
FROM listofartists
LEFT JOIN work ON listofartists.ArtistID = work.ArtistID
LEFT JOIN trans ON trans.WorkID = work.workID
WHERE work.workID IS NULL
答案 1 :(得分:1)
您的原始查询几乎是正确的,如果您想保留not in
结构,可以按如下方式更改查询:
您不需要from子句中的trans
表,您需要稍微更改where子句,如下所示。
这将为您提供工作表中存在但其作品在转换表中不存在的艺术家:
SELECT FirstName, LastName
FROM listofartists
JOIN work ON listofartists.ArtistID = work.ArtistID
WHERE work.WorkID NOT IN (SELECT workID FROM trans)
该查询将排除那些根本没有任何作品的艺术家,但如果一位艺术家同时出售和未售出的作品,则会包括在内 - 如果您想要同时排除两位艺术家的作品,则不清楚出售和未出售的作品。
答案 2 :(得分:0)
这可以通过使用NOT NULL
并检查SELECT A.FirstName, A.LastName
FROM artists A
JOIN work W ON A.ArtistID = W.ArtistID
LEFT JOIN transactions T ON T.WorkID = W.workID
WHERE T.TransactionID IS NULL
约束来完成。
SQL查询看起来像这样,
artists
在上面的查询中,我们将work
表加入LEFT JOIN
表以获取每位艺术家的所有作品,然后我们使用work
transactions
表使用TransactionID
表将提供所有工作,无论它在交易表中的条目如何。
最后WHERE条件是确保package Week1;
import java.util.Scanner;
public class Task12 {
public void numbers() {
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
System.out.println("Enter number");
int oddnumbers = 0;
do {
int count = 0;
count = count + i;
System.out.println("The total is:" + count);
if (i % 2 == 0) {
System.out.println("The number is Even");
} else if (i != 9) {
oddnumbers += i;
System.out.println("The number is odd");
System.out.println("the count of odd numbers is :" + oddnumbers);
} else
System.out.println("The number is odd");
System.out.println("the count of odd numbers is :" + oddnumbers);
} while (i != 0);
}
public static void main(String[] args) {
Task12 n = new Task12();
n.numbers();
}
}
IS NULL ,这意味着工作不会出现在任何交易中。