Сравните 2 значения разных типов внутри подзапроса - PullRequest
0 голосов
/ 23 апреля 2009

Я использую базу данных MS SQL, и у меня есть 3 таблицы: «base_info», «messages», «config»

bases:
ID    Name   NameNum
====================================
 1    Home    101
 2    Castle  102
 3    Car     103

messages:
ID    Signal    RecBy    HQ
============================
111    120      Home     1
111    110      Castle   1
111    125      Car      1
222    120      Home     2
222    125      Castle   2
222    130      Car      2
333    100      Home     1
333    110      Car      2

config:
ID  SignalRec  SignalOut  RecBy   HQ
====================================
111     60        45       101    1
111     40        60       102    1
222     50        60       102    2
222     30        90       101    2
333     80        10       103    1

Хорошо, теперь у меня есть подзапрос, в котором я выбираю 'SignalRec' и 'SignalOut' из таблицы конфигурации и сопоставляю его с таблицей сообщений по ID и дате (не указаны выше), проблема в том, что мне это нужно чтобы соответствовать, где messages.RecBy = config.RecBy, но config.RecBy является строкой, но ее эквивалентное имя находится в таблице баз. Поэтому мне почти нужно сделать подзапрос внутри подзапроса или какой-либо тип соединения и сравнить возвращаемое значение.
Вот что у меня есть:

(SELECT TOP 1 config.SignalRec from config WHERE config.ID = messages.ID AND ||I need th other comparison here||...Order By...) As cfgSignalRec,
(SELECT TOP 1 config.SignalOut from config WHERE config.ID = messages.ID AND ||I need th other comparison here||...Order By...) As cfgSignalOut

Я пытался сделать это как можно более понятным, но если вам нужна дополнительная информация, дайте мне знать.

Ответы [ 4 ]

2 голосов
/ 23 апреля 2009

Я думаю, что это может помочь (хотя я не пробовал ...)

SELECT 
    c.SignalRec 
FROM config c 
    INNER JOIN bases b 
        ON c.RecBy = b.NameNum 
    INNER JOIN messages m 
        ON b.Name = m.RecBy
WHERE c.ID = m.ID

Однако, как указал Энтони, вы, вероятно, хотите нормализовать строки в столбце RecBy в таблице messages, так как у вас есть те же данные в таблице bases.

2 голосов
/ 23 апреля 2009

Я бы нормализовал RecBy в вашей таблице сообщений для ссылки на таблицу баз. Зачем вам вставлять содержимое строки туда, если на него также ссылаются в базах?

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

Чтобы сделать это более понятным, RecBy в таблице сообщений должен быть внешним ключом для Bases.

0 голосов
/ 24 апреля 2009

Думаю, я не совсем понял, что хотел сделать, извините за это. Данные на самом деле отличаются в 2 таблицах, хотя корреляции одинаковы. Довольно сложно объяснить, не вдаваясь в подробности о том, как работает система.
Я действительно нашел очень быстрый способ сделать это.
Внутри моего подзапроса я делаю это:

(SELECT TOP 1 config.Signal FROM config,bases 
     WHERE config.ID = messages.ID AND bases.Name = messages.RecBy AND bases.NameNum = 
     config.RecBy Order By...)  

Таким образом, это по существу сравнивает 2 RecBy разных таблиц, даже если одна является целым числом, а другая - строкой. Это напоминает мне совпадение и поиск в Excel.

0 голосов
/ 23 апреля 2009

Из вашего описания просто звучит так, как будто вам нужно два СОЕДИНЕНИЯ

SELECT TOP 1
    c.SignalRec
FROM 
    config c
INNER JOIN 
    bases b
ON c.RecBy = b.NameNum
INNER JOIN
    messages m
ON b.Name = m.RecBy
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...