3

外部キーを介して接続された 2 つのテーブルがあります。テーブルAでは、時間列のデータがテーブルBの開始列以上であり、時間列のデータがテーブルbの終了列以下であるすべての行を取得しようとしています. これには内部結合が機能する可能性があると考えていましたが、結果は期待したものではありません。いくつかのデータを返していますが、繰り返しています。

ここに私が持っているものがあります:

SELECT * FROM columnA
INNER JOIN columnB
ON columnA.time >= columnB.start
OR columnA.time <= columnB.stop

私はこれを間違って見ていますか?内部結合は、このデータを収集する正しい方法ですか?

アップデート:

実際、tableA の外部キーは tableB の主キーに接続しています。とにかく私はこれをしました:

SELECT * FROM tableA
INNER JOIN tableB
ON tableA.time >= tableB.start
AND tableA.time <= tableB.stop

あなたがしたことをしなかった理由は、データが数年前からデータベースにあり、最近、外部キーを含む列を追加したからです。したがって、その列にはまだデータがありません。そのため、情報で更新する列を知ることができるようにクエリを実行しています。データは返されましたが、要件を満たしていない他のデータも返されました。

4

5 に答える 5

1

それらの関係を定義するcolumnNameを使用してそれらを結合し、WHERE句に条件を設定する必要があります。(条項ではありませんON

SELECT a.*, b.*
FROM    tableA a
        INNER JOIN tableB b
            ON a.colName = b.colName  -- colName is the column that links 
WHERE   a.`time` >= b.`start` OR      -- both tables.
        a.`time` <= b.`stop`
于 2012-09-19T03:18:07.330 に答える
1

外部キーを使用して結合を実行してから、基準に一致しない結果を除外する必要があります。

Select * from TableA
Inner join TableB on TableA.Key = TableB.Key
Where TableA.time >= TableB.Start
Or TableA.time <= TableB.Stop

原則として、私は常にW3SchoolsのSQLページを手元に置いています。これは、私が忘れてしまった可能性があり、簡単な復習が必要なSQL関数の最高のクイックリファレンスです。また、学ぶのに最適な場所です。

于 2012-09-19T03:22:32.580 に答える
0
SELECT a.* 
FROM columnA a 
INNER JOIN columnB b ON a.joiningColumn = b.joiningColumn
WHERE a.time >= b.start
OR a.time <= b.stop
于 2012-09-19T03:24:49.743 に答える
0

ご質問から...

where the data in the time column is greater than or equal to the table B start column  
  AND  
where the data in the time column is less than or equal to the table b end column

しかし、あなたのクエリは...

columnA.time >= columnB.start  
  OR  
columnA.time <= columnB.stop  

他の方のメモと合わせて、外部キーを使った参加について...

SELECT
  *
FROM
  TableA
INNER JOIN
  TableB
    ON  TableA.PK    = TableB.FK
    AND TableA.time >= TableB.start
    AND TableA.time <= TableB.stop 
于 2012-09-19T03:33:04.010 に答える
0

WHERE を追加して、探していた正確な行のデータと一致させることで、解決策を見つけることができました。これが私の解決策です:

SELECT * FROM tableA
INNER JOIN tableB
ON tableA.timetag >= tableB.start
AND tableA.timetag <= tableB.stop
WHERE tableB.id = "1"
于 2012-09-25T03:20:42.277 に答える