0

Oracleに2つのテーブルがあります

TABLE A (すべてのフィールドが主キー)
----------------------------------------------
シド (INT)   
曜日 (CHAR)
DATETIME (日時)
TABLE B (すべてのフィールドが主キー - テーブル A と同じ)
-------------------------------------------------- -------
シド
日曜日
日付時刻

テーブル A のレコードを検索したい

where A.SID = B.SID
AND A.SDAY = B.SDAY
AND A.DATETIME <> B.DATETIME

(つまり、日時を除くテーブル B の対応する列に一致するテーブル A のレコードを検索したい)

Direct INNER JOIN SQL で結果が得られません。何か案は?

これもうまくいきませんでした

SELECT A.* FROM TABLE_A A
WHERE  EXISTS (
SELECT 'X' FROM TABLE_B B
WHERE A.SID = B.SID
AND A.SDAY = B.SDAY 
AND A.DATETIME <> B.DATETIME)
4

2 に答える 2

0

私はおそらく存在するのではなく内部結合としてそれを行うでしょうが、あなたのものはうまくいくと思います.

SELECT A.* 
FROM TABLE_A A
INNER JOIN TABLE_B B
ON  A.SID = B.SID
AND A.SDAY = B.SDAY 
AND A.DATETIME <> B.DATETIME

それでも結果が得られない場合は、テスト用のサンプル データを投稿してみてください。


上記の結合が機能することを示すために実行できる完全なテスト:

CREATE TABLE #Table_a
(
    [SID] INT, 
    SDAY CHAR,
    [DATETIME] DATETIME
)

CREATE TABLE #Table_b
(
    [SID] INT, 
    SDAY CHAR,
    [DATETIME] DATETIME
)

INSERT INTO #Table_a
        ( SID, SDAY, DATETIME )
VALUES  ( 0, -- SID - int
          'A', -- SDAY - char
          '2012-12-27 23:00:01'  -- DATETIME - datetime
          )
INSERT INTO #Table_a
        ( SID, SDAY, DATETIME )
VALUES  ( 2, -- SID - int
          'B', -- SDAY - char
          '2012-12-27 23:00:01'  -- DATETIME - datetime
          )
INSERT INTO #Table_a
        ( SID, SDAY, DATETIME )
VALUES  ( 3, -- SID - int
          'C', -- SDAY - char
          '2012-12-27 23:00:01'  -- DATETIME - datetime
          )




INSERT INTO #Table_B
        ( SID, SDAY, DATETIME )
VALUES  ( 0, -- SID - int
          'A', -- SDAY - char
          '2012-12-27 3:00:01'  -- DATETIME - datetime
          )
INSERT INTO #Table_B
        ( SID, SDAY, DATETIME )
VALUES  ( 2, -- SID - int
          'B', -- SDAY - char
          '2012-12-27 3:00:01'  -- DATETIME - datetime
          )
INSERT INTO #Table_B
        ( SID, SDAY, DATETIME )
VALUES  ( 3, -- SID - int
          'C', -- SDAY - char
          '2012-12-27 23:00:01'  -- DATETIME - datetime
          )


SELECT A.* 
FROM #TABLE_A A
INNER JOIN #TABLE_B B
ON  A.SID = B.SID
AND A.SDAY = B.SDAY 
AND A.DATETIME <> B.DATETIME


DROP TABLE #Table_a
DROP TABLE #Table_b
于 2012-12-27T22:58:33.193 に答える
0

次のようなテーブル定義を示した場合、質問が読みやすくなるかもしれません。

-- Oracle に 2 つのテーブルがあります。

CREATE TABLE TABLE_A -- BTW: why the caps?
  ( SID INTEGER NOT NULL
  , SDAY CHAR NOT NULL
  , ZDATETIME DATETIME NOT NULL -- note: using a typename as an identier
                                -- will break things.
  , PRIMARY KEY (SID,SDAY,ZDATETIME)
  );

CREATE TABLE TABLE_B -- all (1)fields are primary keys
   ( SID SDAY DATETIME NOT NULL PRIMARY KEY
   );

[これはコメントであるべきかもしれませんが、コメントにはフォーマットの可能性がありません]

(つまり、テーブル B の対応する列に一致するテーブル A のレコードを検索したい

EXISTS

日時を除く)

NOT EXISTS

さて、解決策は次のとおりです。

SELECT A.* FROM TABLE_A A

WHERE  EXISTS (
    SELECT 1 FROM TABLE_B B
    WHERE A.SID = B.SID
    AND A.SDAY = B.SDAY 
    )
AND NOT  EXISTS (
    SELECT 2 FROM TABLE_B B
    WHERE A.SID = B.SID
    AND A.SDAY = B.SDAY 
    AND A.ZDATETIME = B.ZDATETIME
    )
    ;
于 2012-12-27T23:03:30.937 に答える