从第三个表中选择记录,同时比较其他表

时间:2016-10-07 12:02:44

标签: mysql sql

我有3个表:artiststransactionsworks,包含以下字段:

  • artists ArtistsIDLastNameFirstName
  • transactions :TransactionID,WorkID,CustomerID
  • work - WorkIDArtistsID

我想做的是:
选择其作品尚未被图库销售的每位艺术家的姓氏和名字。

到目前为止,我所做的是:

SELECT FirstName
    , LastName
FROM listofartists
    , work
    , trans
WHERE listofartists.ArtistID = work.ArtistID
    AND trans.WorkID NOT IN (
        SELECT workID
        FROM work
    )

3 个答案:

答案 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 ,这意味着工作不会出现在任何交易中。