0

cardIDクエリの後に'のリストを返しました。それらの'は2つのテーブルとcardIDに属しています。では、どうすればそれらを結合して、の名前とそれに応じた名前を示すテーブルを返すことができますか?StudentPersonnelcardIDStudentPersonnelStudentPersonnelcardID

人事表:

PERSONNELID NUMBER(9,0) 
PERSONNELNAME   VARCHAR2(20)    
PERSONNELSURNAME    VARCHAR2(20)    
PERSONNELJOB    VARCHAR2(40)    
PERSONNELCARDID NUMBER(4,0) 

学生用テーブル:

STUDENTID   NUMBER(9,0) 
STUDENTNAME VARCHAR2(20)    
STUDENTSURNAME  VARCHAR2(20)    
STUDENTDEPT VARCHAR2(40)    
STUDENTFACULTY  VARCHAR2(20)    
STUDENTCARDID   NUMBER(4,0) 

CardIDテーブル

   CARDID   NUMBER(4,0) 
   USERTYPE VARCHAR2(20)    
   CHARGE   NUMBER(3,2) 
   CREDIT   NUMBER(4,2) 

PaymentDeviceテーブル:

    ORDERNO NUMBER  
    PAYDEVIP    NUMBER(8,0) 
    PAYDEVDATE  DATE    No  
    PAYDEVTIME  VARCHAR2(8) 
    CHARGEDCARDID   NUMBER(9,0) 
    MEALTYPE       VARCHAR2(10)

2012年12月27日にカフェテリアで食べた最初の10人の名前と名前を返そうとしました

SELECT C.CARDID
FROM CARD C, PAYMENTDEVICE P
WHERE P.ORDERNO
BETWEEN (SELECT MIN(ORDERNO)
FROM PAYMENTDEVICE
WHERE PAYDEVDATE='27/12/2012') AND (SELECT MIN(ORDERNO)
FROM PAYMENTDEVICE
WHERE PAYDEVDATE='27/12/2012')+10    AND C.CARDID=P.CHARGEDCARDID;

私たちorderNoは毎日リセットされるわけではありませんが、増え続けているので、orderNoその日の最小値を見つけ、この値に10を加算して、それらの注文番号の間にその日に食べる最初の10人を見つけます。

したがって、このクエリから何が返されますか?

  CARDID
  1005
  1000
  1002
  1003
  1009
  2000
  2001
  1007
  2002
  1004
  1006

そして、それらのcardId(1で始まる)のstudentCardIdいくつかはであり、それらのいくつか(2で始まる)はPersonnelCardIdです。では、どうすればそれに応じて名前を照合して書き込むことができますか?

4

2 に答える 2

1
SELECT *
FROM Personel p INNER JOIN Student s 
ON p.PersonnelCardId = s.StudentCardId 
INNER JOIN ReturnedQuery rq
ON rq.CardId = p.PersonnelCardId

更新しました:

    SELECT p.PersonnelName, rq.CardId
    FROM Personel p INNER JOIN ReturnedQuery rq
    ON rq.CardId = p.PersonnelCardId 

    UNION

    SELECT s.StudentName, rq.Cardid
    FROM Student s INNER JOIN ReturnedQuery rq 
    ON s.StudentCardId = rq.Cardid 
于 2012-12-27T19:48:33.690 に答える
1

元のクエリは実際にはかなり壊れやすいものです。私はそれをそのように書き直します(そして必要な結合を追加しました):

WITH First_Daily_Purchase as (SELECT chargedCardId,
                                     MIN(payDevTime) as payDevTime, 
                                     MIN(orderNo) as orderNo
                              FROM PaymentDevice
                              WHERE payDevDate >= 
                                              TO_DATE('2012-12-27', 'YYYY-MM-DD')
                                    AND payDevDate <
                                              TO_DATE('2012-12-28', 'YYYY-MM-DD')
                              GROUP BY chargedCardId),
     First_10_Daily_Purchasers as (SELECT chargedCardId
                                   FROM (SELECT chargedCardId, 
                                                RANK() OVER(ORDER BY payDevTime,
                                                                 orderNo) as rank
                                         FROM First_Daily_Purchase) a
                                   WHERE a.rank < 11)
SELECT a.chargedCardId, b.personnelName, b.personnelSurname
FROM First_10_Daily_Purchasers a
JOIN Personnel b
ON b.personnelCardId = a.chargedCardId
UNION ALL
SELECT a.chargedCardId, b.studentName, b.studentSurname
FROM First_10_Daily_Purchasers a
JOIN Student b
ON b.studentCardId = a.chargedCardId

SQL Fiddleが機能している-一般的に防弾には時間がかかりました。)
これにより、購入した最初の10人が取得されます(実際に取得した最初の11回の購入ではありません)。もちろん、これpayDevTimeは実際にソート可能な形式で保存されていることを前提としています(そうでない場合は、このクエリが正しく機能しないよりも大きな問題があります)。

とはいえ、スキーマ設計には多くの厄介なことがあります。

于 2012-12-27T21:42:43.370 に答える