【问题标题】:Print multiple rows in some order as different columns以某种顺序将多行打印为不同的列
【发布时间】:2022-01-10 06:21:20
【问题描述】:
/* Note: on update/delete, no action (restriction) is
   the default. (SQL Server & Oracle) */

CREATE TABLE Faculty (
FacNo         CHAR(11)      NOT NULL,
FacFirstName  VARCHAR(30)   NOT NULL,
FacLastName   VARCHAR(30)   NOT NULL,
FacCity       VARCHAR(30)   NOT NULL,
FacState      CHAR(2)       NOT NULL,
FacDept       CHAR(6)       NULL,
FacRank       CHAR(4)       NULL,
FacSalary     DECIMAL(10,2) NULL,
FacSupervisor CHAR(11)      NULL,
FacHireDate   DATETIME      NULL,
FacZipCode    CHAR(10)      NOT NULL,
CONSTRAINT FacultyPK PRIMARY KEY (FacNo), 
CONSTRAINT SupervisorFK FOREIGN KEY (FacSupervisor) REFERENCES Faculty )
go

/* Note: on update cascade for FacSupervisor caused the following error
   in SQL Server 2004:

     Introducing FOREIGN KEY CONSTRAINT 'SupervisorFK' on table 'Faculty'
     may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION
     or ON UPDATE NO ACTION, or modify other FOREIGN KEY CONSTRAINTs.
*/

CREATE TABLE Course (
CourseNo      CHAR(6)       NOT NULL,
CrsDesc       VARCHAR(50)   NOT NULL,
CrsUnits      INTEGER       NULL,
CONSTRAINT CoursePK PRIMARY KEY (CourseNo) )
go

CREATE TABLE Offering (
OfferNo       INTEGER       NOT NULL,
CourseNo      CHAR(6)       NOT NULL,
OffTerm       CHAR(6)       NOT NULL,
OffYear       INTEGER       NOT NULL,
OffLocation   VARCHAR(30)   NULL,
OffTime       VARCHAR(10)   NULL,
FacNo         CHAR(11)      NULL,
OffDays       CHAR(4)       NULL,
CONSTRAINT OfferingPK PRIMARY KEY (OfferNo),
CONSTRAINT CourseFK FOREIGN KEY (CourseNo) REFERENCES Course,
CONSTRAINT FacultyFK FOREIGN KEY (FacNo) REFERENCES Faculty )
go

CREATE TABLE Student (
StdNo         CHAR(11)      NOT NULL,
StdFirstName  VARCHAR(30)   NOT NULL,
StdLastName   VARCHAR(30)   NOT NULL,
StdCity       VARCHAR(30)   NOT NULL,
StdState      CHAR(2)       NOT NULL,
StdZip        CHAR(10)      NOT NULL,
StdMajor      CHAR(6)       NULL,
StdClass      CHAR(2)       NULL,
StdGPA        DECIMAL(3,2)  NULL,
CONSTRAINT StudentPk PRIMARY KEY (StdNo) )
go

CREATE TABLE Enrollment (
OfferNo       INTEGER       NOT NULL,
StdNo         CHAR(11)      NOT NULL,
EnrGrade      DECIMAL(3,2)  NULL,
CONSTRAINT EnrollmentPK PRIMARY KEY (OfferNo, StdNo),
CONSTRAINT OfferingFK FOREIGN KEY (OfferNo) REFERENCES Offering
                      ON DELETE CASCADE
                      ON UPDATE CASCADE,
CONSTRAINT StudentFK FOREIGN KEY (StdNo) REFERENCES Student
                      ON DELETE CASCADE
                      ON UPDATE CASCADE )
go


INSERT INTO Faculty
VALUES ('543210987','VICTORIA','EMMANUEL','BOTHELL','WA','MS','PROF',120000.00,NULL,'4/15/2005','98011-2242')
go
INSERT INTO Faculty
VALUES ('765432109','NICKI','MACON','BELLEVUE','WA','FIN','PROF',65000.00,NULL,'4/11/2006','98015-9945')
go
INSERT INTO Faculty
VALUES ('654321098','LEONARD','FIBON','SEATTLE','WA','MS','ASSC',70000.00,'543210987','5/1/2003','98121-0094')
go
INSERT INTO Faculty
VALUES ('098765432','LEONARD','VINCE','SEATTLE','WA','MS','ASST',35000.00,'654321098','4/10/2004','98111-9921')
go
INSERT INTO Faculty
VALUES ('876543210','CRISTOPHER','COLAN','SEATTLE','WA','MS','ASST',40000.00,'654321098','3/1/2008','98114-1332')
go
INSERT INTO Faculty
VALUES ('987654321','JULIA','MILLS','SEATTLE','WA','FIN','ASSC',75000.00,'765432109','3/15/2009','98114-9954')
go

INSERT INTO Course
VALUES ('FIN300','FUNDAMENTALS OF FINANCE',4)
go
INSERT INTO Course
VALUES ('FIN450','PRINCIPLES OF INVESTMENTS',4)
go
INSERT INTO Course
VALUES ('FIN480','CORPORATE FINANCE',4)
go
INSERT INTO Course
VALUES ('IS320','FUNDAMENTALS OF BUSINESS PROGRAMMING',4)
go
INSERT INTO Course
VALUES ('IS460','SYSTEMS ANALYSIS',4)
go
INSERT INTO Course
VALUES ('IS470','BUSINESS DATA COMMUNICATIONS',4)
go
INSERT INTO Course
VALUES ('IS480','FUNDAMENTALS OF DATABASE MANAGEMENT',4)
go

INSERT INTO Offering
VALUES (1111,'IS320','SUMMER',2017,'BLM302','10:30:00',NULL,'MW')
go
INSERT INTO Offering
VALUES (1234,'IS320','FALL',2016,'BLM302','10:30:00','098765432','MW')
go
INSERT INTO Offering
VALUES (2222,'IS460','SUMMER',2016,'BLM412','13:30:00',NULL,'TTH')
go
INSERT INTO Offering
VALUES (3333,'IS320','SPRING',2017,'BLM214','8:30:00','098765432','MW')
go
INSERT INTO Offering
VALUES (4321,'IS320','FALL',2016,'BLM214','15:30:00','098765432','TTH')
go
INSERT INTO Offering
VALUES (4444,'IS320','WINTER',2017,'BLM302','15:30:00','543210987','TTH')
go
INSERT INTO Offering
VALUES (5555,'FIN300','WINTER',2017,'BLM207','8:30:00','765432109','MW')
go
INSERT INTO Offering
VALUES (5678,'IS480','WINTER',2017,'BLM302','10:30:00','987654321','MW')
go
INSERT INTO Offering
VALUES (5679,'IS480','SPRING',2017,'BLM412','15:30:00','876543210','TTH')
go
INSERT INTO Offering
VALUES (6666,'FIN450','WINTER',2017,'BLM212','10:30:00','987654321','TTH')
go
INSERT INTO Offering
VALUES (7777,'FIN480','SPRING',2017,'BLM305','13:30:00','765432109','MW')
go
INSERT INTO Offering
VALUES (8888,'IS320','SUMMER',2017,'BLM405','13:30:00','654321098','MW')
go
INSERT INTO Offering
VALUES (9876,'IS460','SPRING',2017,'BLM307','13:30:00','654321098','TTH')
go

INSERT INTO Student
VALUES ('123456789','HOMER','WELLS','SEATTLE','WA','98121-1111','IS','FR',3.00)
go
INSERT INTO Student
VALUES ('124567890','BOB','NORBERT','BOTHELL','WA','98011-2121','FIN','JR',2.70)
go
INSERT INTO Student
VALUES ('234567890','CANDY','KENDALL','TACOMA','WA','99042-3321','ACCT','JR',3.50)
go
INSERT INTO Student
VALUES ('345678901','WALLY','KENDALL','SEATTLE','WA','98123-1141','IS','SR',2.80)
go
INSERT INTO Student
VALUES ('456789012','JOE','ESTRADA','SEATTLE','WA','98121-2333','FIN','SR',3.20)
go
INSERT INTO Student
VALUES ('567890123','MARIAH','DODGE','SEATTLE','WA','98114-0021','IS','JR',3.60)
go
INSERT INTO Student
VALUES ('678901234','TESS','DODGE','REDMOND','WA','98116-2344','ACCT','SO',3.30)
go
INSERT INTO Student
VALUES ('789012345','ROBERTO','MORALES','SEATTLE','WA','98121-2212','FIN','JR',2.50)
go
INSERT INTO Student
VALUES ('876543210','CRISTOPHER','COLAN','SEATTLE','WA','98114-1332','IS','SR',4.00)
go
INSERT INTO Student
VALUES ('890123456','LUKE','BRAZZI','SEATTLE','WA','98116-0021','IS','SR',2.20)
go
INSERT INTO Student
VALUES ('901234567','WILLIAM','PILGRIM','BOTHELL','WA','98113-1885','IS','SO',3.80)
go

INSERT INTO Enrollment
VALUES (1234,'123456789',3.30)
go
INSERT INTO Enrollment
VALUES (1234,'234567890',3.50)
go
INSERT INTO Enrollment
VALUES (1234,'345678901',3.20)
go
INSERT INTO Enrollment
VALUES (1234,'456789012',3.10)
go
INSERT INTO Enrollment
VALUES (1234,'567890123',3.80)
go
INSERT INTO Enrollment
VALUES (1234,'678901234',3.40)
go
INSERT INTO Enrollment
VALUES (4321,'123456789',3.50)
go
INSERT INTO Enrollment
VALUES (4321,'124567890',3.20)
go
INSERT INTO Enrollment
VALUES (4321,'789012345',3.50)
go
INSERT INTO Enrollment
VALUES (4321,'876543210',3.10)
go
INSERT INTO Enrollment
VALUES (4321,'890123456',3.40)
go
INSERT INTO Enrollment
VALUES (4321,'901234567',3.10)
go
INSERT INTO Enrollment
VALUES (5555,'123456789',3.20)
go
INSERT INTO Enrollment
VALUES (5555,'124567890',2.70)
go
INSERT INTO Enrollment
VALUES (5678,'123456789',3.20)
go
INSERT INTO Enrollment
VALUES (5678,'234567890',2.80)
go
INSERT INTO Enrollment
VALUES (5678,'345678901',3.30)
go
INSERT INTO Enrollment
VALUES (5678,'456789012',3.40)
go
INSERT INTO Enrollment
VALUES (5678,'567890123',2.60)
go
INSERT INTO Enrollment
VALUES (5679,'123456789',2.00)
go
INSERT INTO Enrollment
VALUES (5679,'124567890',3.70)
go
INSERT INTO Enrollment
VALUES (5679,'678901234',3.30)
go
INSERT INTO Enrollment
VALUES (5679,'789012345',3.80)
go
INSERT INTO Enrollment
VALUES (5679,'890123456',2.90)
go
INSERT INTO Enrollment
VALUES (5679,'901234567',3.10)
go
INSERT INTO Enrollment
VALUES (6666,'234567890',3.10)
go
INSERT INTO Enrollment
VALUES (6666,'567890123',3.60)
go
INSERT INTO Enrollment
VALUES (7777,'876543210',3.40)
go
INSERT INTO Enrollment
VALUES (7777,'890123456',3.70)
go
INSERT INTO Enrollment
VALUES (7777,'901234567',3.40)
go
INSERT INTO Enrollment
VALUES (9876,'124567890',3.50)
go
INSERT INTO Enrollment
VALUES (9876,'234567890',3.20)
go
INSERT INTO Enrollment
VALUES (9876,'345678901',3.20)
go
INSERT INTO Enrollment
VALUES (9876,'456789012',3.40)
go
INSERT INTO Enrollment
VALUES (9876,'567890123',2.60)
go
INSERT INTO Enrollment
VALUES (9876,'678901234',3.30)
go
INSERT INTO Enrollment
VALUES (9876,'901234567',4.00)
go

例如架构。

获取在同一开课年 (OffYear) 提供课程的两个不同教员的所有教员编号 (FacNo) 和姓氏 (FacLastName)。输出中不得有重复项。

*注:例如,如果 P1 Smith 和 P2 Peters 都在 2021 年开设课程,则必须选择 [P1, Smith, P2, Peters](或 [P2, Peters, P1, Smith],但不能同时选择两者) .因此,输出必须如下所示:

FacNo FacLastName FacNo FacLastName
  ===== =========== ===== ===========
  P1    Smith       P2    Peters     
  ...   ...         ...   ...        
  ===== =========== ===== ===========*

我正在尝试做这样的事情,但我什至想不出从哪里开始?我该如何解决这个问题?

我试过这样的

SELECT f1.FacNo, f1.FacLastName
FROM Offering o1
INNER JOIN Faculty f1 on o1.FacNo = f1.FacNo
INNER JOIN Offering o2 on o1.OffYear = o2.OffYear

【问题讨论】:

  • 除此之外... SQL Server 2004?没有这样的事情。 BizTalk Server 2004 是一个东西,但它包括 SQL Server 2000 SP4。 Error 1785 发生是因为您不能在级联更新和删除中包含循环,其中包括在您的 SupervisorFK 外键中自引用表。
  • 您需要根据所提供的样本数据向我们展示您想要的结果。

标签: sql sql-server tsql


【解决方案1】:

你在正确的轨道上。在OffYear 上正确加入Offering 表两次,您可以获得同一年的课程组合。既然要两位教员的名字,还需要加入Faculty表两次:

    SELECT f1.FacNo, f1.FacLastName, f2.FacNo, f2.FacLastName
      FROM Offering o1 
INNER JOIN Faculty f1 
        on o1.FacNo = f1.FacNo 
INNER JOIN Offering o2
        on o2.OffYear = o1.Offyea
INNER JOIN Faculty f2
        on o2.FacNo = f2.FacNo 

然而,这将包括完全重复的行(例如,当两名教员在同一年有两门课程时)、教员与他们自己的组合以及以相反顺序重复的姓名组合(都 [P1、Smith、P2、Peters]和 [P2,彼得斯,P1,史密斯])。

要删除确切的重复项,请使用 SELECT DISTINCT 而不是 SELECT。其他两个问题可以通过一个WHERE 条件轻松解决:通过限制结果以使第一个成员的FacNo 小于另一个成员,过滤掉不需要的组合。

    SELECT DISTINCT f1.FacNo, f1.FacLastName, f2.FacNo, f2.FacLastName
      FROM Offering o1 
INNER JOIN Faculty f1 
        on o1.FacNo = f1.FacNo 
INNER JOIN Offering o2
        on o2.OffYear = o1.Offyear
INNER JOIN Faculty f2
        on o2.FacNo = f2.FacNo 
WHERE f1.FacNo < f2.FacNo

this dB<>fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多