Создание таблицы Присоединиться Проблема? - PullRequest
0 голосов
/ 01 октября 2009

Использование SQL Server 2000

Наличие двух столов

Table1

Date ID

20090101 001
20090102 001
….
20090101 002
20090102 002
…

20090101 003
20090102 003
…

Так далее ..,

Table2

ID Name Date

001 Raja 20090408
001 Raja 20090502
001 Raja 20090503
002 Ravi 20090312
002 Ravi 20090522
003 Saga 20090802
003 Saga 20091022

Так далее ..,

Запрос

SELECT
   Table1.Date, Table1.ID, 
   Table2.Name, Table2.Date 
FROM table1 
INNER JOIN table2 ON table1.id = table2.id 
ORDER BY table1.id, table1.date

выход

Date ID Name Table2.Date

20090101 001 Raja 20090408
20090101 001 Raja 20090502
20090101 001 Raja 20090503
20090102 001 Raja 20090408
20090102 001 Raja 20090502
20090102 001 Raja 20090503
…

20090101 002 Ravi 20090312
20090101 002 Ravi 20090522
20090102 002 Ravi 20090312
20090102 002 Ravi 20090522
…

Итак ...,

Почему я получаю table1.date снова и снова. Я хочу отображать вот так.

Ожидаемый результат

Date ID Name Table2.Date

20090101 001 Raja   - 
…
20090502 001 Raja 20090502
20090503 001 Raja 20090503
…
20090107 001 Raja   -
20090108 001 Raja 20090408
….

Итак ...,

Я ставлю "-" вместо пустого столбца

Table2.Date should equal to Table1.Date, means 
Table1.Date, Table1.ID should display all the columns, 
Table2.Date should display with Table1.Date Related column. 
* +1032 * Пример. * * 1 033
Table2 Column Values are

Date - 20090203, 20090205...,

Table1.ID Table1.Date Table2.Date

001 20090201 
001 20090202 
001 20090203 20090203
001 20090204
001 20090205 20090205
001 20090206 

...,

Прежде чем я сделаю запрос в Access 2003

SELECT AllPossibleCardEvents.Id,  AllPossibleCardEvents.Date, Actual.Date AS Table2Date FROM ((SELECT p.Id,  AllDates.Date FROM (SELECT DISTINCT Date FROM table2) AllDates, table1  p) AllPossibleCardEvents LEFT OUTER JOIN table2  Actual ON AllPossibleCardEvents.Id = Actual.Id AND AllPossibleCardEvents.tDate = Actual.Date) ) 

Теперь приведенный выше запрос отлично работает для ожидаемого результата при доступе

Как сделать запрос Sql для этого условия?

Нужна помощь по запросу

Ответы [ 3 ]

4 голосов
/ 01 октября 2009

Судя по всему, все, что вам не хватает, так это присоединиться к столбцам даты:

Select 
  Table1.Date, Table1.ID, Table2.Name, Table2.Date 
from table1 
inner join table2 on table1.id = table2.id and table1.date = table2.date
order by table1.id, table1.date

Это если я правильно понял ваш вопрос.

Если вы хотите отобразить значения NULL, вам нужно перейти к левому соединению:

Select 
  Table1.Date, Table1.ID, Table2.Name, Table2.Date 
from table1 
left join table2 on table1.id = table2.id and table1.date = table2.date
order by table1.id, table1.date

EXTRA:

Я добавил дополнительные sql, которые могут дать вам эквивалентные результаты в вашем запросе Access. Если я правильно понимаю запрос Access, вы сопоставляете все записи, но отображаете только table2.Date, когда он совпадает с table1.Date.

Попробуйте это:

SELECT
    table1.Id,
    table1.Date,
    CASE WHEN table1.Date = table2.Date THEN table2.Date ELSE '-' END AS Table2Date
FROM table1
CROSS JOIN table2

Если это все еще не то, что вы ищете, я не думаю, что понимаю ваши вопросы вообще.

2 голосов
/ 01 октября 2009

Прежде всего, если у вас есть несуществующие значения в table2, вам нужно использовать LEFT OUTER JOIN вместо INNER JOIN. ВНУТРЕННЕЕ СОЕДИНЕНИЕ по схеме только показывает строки, в которых обе таблицы имеют значения, например он отфильтрует все, что не существует в table2. Кроме того, вы не присоединяетесь к «дате» - поэтому вы получаете намного больше строк результатов, чем ожидалось.

Во-вторых, если вы хотите отобразить что-то кроме NULL для несуществующих значений в table2, вам нужно использовать ISNULL, чтобы указать, что отображать вместо NULL:

SELECT
   Table1.Date, Table1.ID, Table2.Date
FROM table1 
LEFT OUTER JOIN 
   table2 ON table1.id = table2.id AND table1.date = table2.date
ORDER BY table1.id, table1.date

Я получаю вывод примерно так:

table1.Date                 table1.ID    table2.Date
2009-01-01 00:00:00.000        1            NULL
2009-01-02 00:00:00.000        1            NULL
2009-02-03 00:00:00.000        1            NULL
2009-02-05 00:00:00.000        1            NULL
2009-04-08 00:00:00.000        1         2009-04-08 00:00:00.000
2009-05-03 00:00:00.000        1         2009-05-03 00:00:00.000
2009-01-01 00:00:00.000        2            NULL
2009-01-02 00:00:00.000        2            NULL
2009-01-01 00:00:00.000        3            NULL
2009-01-02 00:00:00.000        3            NULL

Пожалуйста, уточните, что не так с этим выводом ....

Марк

1 голос
/ 01 октября 2009
SELECT AllPossibleCardEvents.Date, 
       AllPossibleCardEvents.ID, 
       COALESCE(Table2.Date, '-') Table2Date
FROM (SELECT DISTINCT t1.ID, t2.Date 
        FROM table1 t1 CROSS JOIN table2 t2) AllPossibleCardEvents
     LEFT JOIN table2 ON AllPossibleCardEvents.ID = table2.ID 
                     AND AllPossibleCardEvents.Date = table2.Date
ORDER BY AllPossibleCardEvents.ID, AllPossibleCardEvents.Date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...